(function($, dermquest, window, undefined){
dermquest.register("Settings", new function(){
var me = {};
me.Dictionary = {
no_facets: "-- Undetermined --",
no_results: "No results matched the search criteria. Remove filters on the left to broaden your search.",
and_operator: "and",
or_operator: "or",
none: "None"
}
me.Templates = {
image_touch_interaction: 'Touch the image to zoom or tap here to view full size',
image_click_interation: 'Hover over the image to zoom or click here to view full size',
image_search_results: "Showing {{#min}}{{min}}-{{max}} of{{/min}} {{total_results}} results",
single_image_search_result: "Showing {{total_results}} result",
view_images: 'View Images',
no_visible_facets: '
');
$inner_list.append($facet_item);
}
}
$item.append($inner_list);
}
$list.append($item)
});
if ($list.html().length > 0) {
$me.html($list);
}
}
function reset() {
$me.empty();
}
me.update = update;
init();
return me;
},
SelectList: function($parent, config) {
var me = _.extend({}, Backbone.Events),
$me = $('');
var filtered = false;
var data = config.data;
if (!config.roots) {
config.roots = data.Roots;
}
var state = new dermquest.Settings.Objects.State(config.id);
function init() {
// Two events fired for each input element...
// Triggered only when the element is clicked
$me.on("click", "input", function (e) {
updateBranch(e.currentTarget);
});
// Triggered whenever the input element is changed
$me.on("change", "input", function (e) {
updateLeaf(e.currentTarget);
});
$me.on("mouseenter", "label", function (e) {
$(e.currentTarget).siblings('ul').addClass('highlight');
});
$me.on("mouseleave", "label", function (e) {
$(e.currentTarget).siblings('ul').removeClass('highlight');
});
build();
}
function build() {
function buildBranch(facets, root) {
var branch_html = "
";
for (var i = 0, l = facets.length; i < l; i++) {
var id = facets[i],
facet = data.Facets[id],
input_id = "facet_" + id,
item = '
"
return branch_html;
}
if (config["class"]) {
$me.addClass(config["class"]);
}
if (config["panelled"]) {
$me.addClass("panelled-select-list");
}
$me.append(buildBranch(config.roots, true));
$parent.append($me);
}
// Updates a single level in the filter list, activating the parent LI of the passed element
function updateLeaf(el) {
var $input = $(el),
$item = $input.parent("li");
var active = $input.is(":checked"),
facet_id = parseInt($input.val());
if (active) {
state.selection = _.union(state.selection, facet_id);
$item.addClass("active");
} else {
state.selection = _.without(state.selection, facet_id)
$item.removeClass("active");
}
if (config.limit === 1) {
state.selection = facet_id;
$me.find('input[name=' + config.group_name + ']').not(':checked').parent('li').deactivate();
}
me.trigger("change", state, me);
}
// Updates all levels in a branch
function updateBranch(el, active) {
var $input = $(el),
$children_inputs = $input.siblings("ul").find("input"),
$parents = $input.parent().parents(".select-list li"),
$branch_root = $input.parents().filter(".branch-root"),
branch_facet_id = parseInt($branch_root.attr("data-facet-id"));
active = active || $input.is(":checked");
// Set all children to the current active state. Since there are no other dependancies, we can just blanket change these
if (filtered) {
$children_inputs = $input.siblings("ul").find(".show").children('input');
$children_inputs.attr("checked", active);
$children_inputs.trigger("change");
} else {
$children_inputs.attr("checked", active);
$children_inputs.trigger("change");
}
// Iterate through all parent LIs
for (var i = 0, l = $parents.length; i < l; i++) {
var $li = $($parents[i]),
$parent_input = $li.children("input"),
$children_inputs = $parent_input.siblings("ul").find("input:checked");
// If we are trying to activate all levels, or if there are no active children, go ahead and update, trigger the change event.
if (active || !$children_inputs.length) {
$parent_input.attr("checked", active)
$parent_input.trigger("change")
}
}
var branch_active = $branch_root.children("input:checked").length;
$input.attr('checked', active);
me.trigger("branch-update", branch_facet_id, branch_active);
}
function update(new_selection) {
new_selection = new_selection || [];
state.selection = [];
var old_facets = _.difference(state.selection, new_selection);
for (var i = 0, l = old_facets.length; i < l; i++) {
var $input = $('#facet_' + old_facets[i]),
active = $input.is(':checked');
if (active) {
forceUpdateBranch($input, false);
}
}
for (var i = 0, l = new_selection.length; i < l; i++) {
var $input = $me.find('#facet_' + new_selection[i]),
active = $input.is(':checked');
if ($input.length) {
state.selection.push(new_selection[i]);
if (!active) {
forceUpdateBranch($input, true);
}
}
}
}
function filter(active_facets) {
var empty_list = true;
filtered = true;
$me.addClass('filtered');
if (active_facets.length) {
$me.find('.show').removeClass('show');
for (var i = 0, l = active_facets.length; i < l; i++) {
var $input = $me.find('#facet_' + active_facets[i]);
if ($input.length) {
$input.parents('li').addClass('show');
empty_list = false;
}
}
}
return empty_list;
}
function forceUpdateBranch($input, active) {
// Have to do this manually because of some browser issues with trigger.click()
$input.attr('checked', active);
updateBranch($input, active);
$input.trigger('change');
}
function focus(facet_id) {
var $active_section = $me.children("ul").children('li[data-facet-id="' + facet_id + '"]');
$active_section.addClass("highlight");
}
function blur() {
$me.children("ul").children("li").removeClass("highlight");
}
function reset() {
if (config.limit === 1) {
$me.find('.active').deactivate();
}
$me.find('.show').removeClass('show');
filtered = false;
$me.removeClass('filtered');
var active_checkboxes = $me.find('input:checked');
active_checkboxes.removeAttr("checked");
active_checkboxes.trigger("change");
state.selection = [];
}
function getSelection() {
return state.selection;
}
function getId() {
return config.id;
}
function getState() {
return state;
}
init();
me.blur = blur;
me.focus = focus;
me.reset = reset;
me.update = update;
me.filter = filter;
me.getSelection = getSelection;
me.getId = getId;
me.getState = getState;
return me;
},
LogicalSelectList: function($target, config) {
var me = _.extend({}, Backbone.Events),
$me = $('');
var $selection_operator = {},
$no_facets_feedback = $(dermquest.Settings.Templates.no_visible_facets);
var default_config = {
'include_operator': true,
'show_trigger': true,
'class': "",
'list_class': "",
'trigger_at_top': true
}
var filtered = false;
var list = {};
var data = config.model.get('data')[config.id],
state = new dermquest.Settings.Objects.State(config.id, true);
var choice_template = Hogan.compile( $("#facet-operator").html());
function init() {
config = _.extend(default_config, config);
config.data = data;
$me.addClass(config.list_class);
build();
list.on('branch-update', function(branch_facet_id, branch_active, selection){
me.trigger('branch-update', branch_facet_id, branch_active)
})
list.on('change', function(new_state){
state = new_state;
})
if (config.include_operator) {
$selection_operator.on("change", "input", function (e) {
var $trigger = $(e.currentTarget),
val = parseInt($trigger.val());
state.operator = val;
});
}
config.model.on('change:route', function(e, route){
if (route) {
var my_route = route[config.id];
if (my_route && my_route.length > 0) {
update(my_route);
} else {
reset();
}
} else {
reset();
}
});
config.model.on('change:results', function(e, results){
if (results) {
var my_results = results[config.id],
visible_facets = state.selection;
if (my_results) {
visible_facets = _.union(visible_facets, my_results)
}
filter(visible_facets);
} else {
reset();
}
});
}
function build() {
function buildChoices() {
var collection_id = config.id.toLowerCase();
return $(choice_template.render({
group_id: collection_id + "_exclusivity",
and_id: collection_id + "_and",
or_id: collection_id + "_or"
}));
}
$no_facets_feedback.hide();
if (config.include_operator) {
$selection_operator = buildChoices();
$me.append($selection_operator);
}
list = new dermquest.Settings.Objects.SelectList($me, config);
if (config.show_trigger) {
var $trigger = $(dermquest.Settings.Templates.view_images);
if (config.trigger_at_top) {
if (config.include_operator) {
$selection_operator.after($trigger);
} else {
$me.prepend($trigger);
}
} else {
$me.append($trigger);
}
}
$target.append($me, $no_facets_feedback);
}
function filter(visible_facets) {
if (visible_facets.length) {
list.filter(visible_facets);
$no_facets_feedback.hide();
$me.show();
} else {
$no_facets_feedback.show();
$me.hide();
}
}
function getState() {
_.extend(state, list.getState())
return state;
}
function getSelection() {
return _.uniq(state.selection);
}
function reset() {
list.reset();
state.selection = [];
}
function update(route) {
list.update(route);
if (config.include_operator) {
updateOperator();
}
}
function updateOperator() {
var operator_id = config.id + "MatchAll",
$options = $selection_operator.find('input:radio'),
route_operator = config.model.get('route')[operator_id];
if (route_operator !== undefined) {
state.operator = parseInt(route_operator);
}
for (var i = 0, l = $options.length; i < l; i++) {
var $option = $options.eq(i),
val = parseInt($option.val());
$option.attr('checked', val===state.operator)
}
}
function blur() {
list.blur();
}
function focus(facet_id) {
list.focus(facet_id);
}
me.init = init;
me.reset = reset;
me.getSelection = getSelection;
me.getState = getState;
me.focus = focus;
me.blur = blur;
init();
return me;
},
AlphaSelectList: function($target, config) {
var me = _.extend({}, Backbone.Events),
$me = $('');
var data = config.data || config.model.get('data')[config.id],
state = new dermquest.Settings.Objects.State(config.id);
var lists = [];
var $content_switcher,
$contents,
$switch_navigation,
$no_facet_feedback = $(dermquest.Settings.Templates.no_visible_facets).hide();
if (config.include_trigger === undefined) {
config.include_trigger = true;
}
function init() {
build();
if (config.model) {
config.model.on("change:route", function(e, route) {
if (route) {
var my_route = route[config.id];
if (my_route && my_route.length > 0) {
update(my_route);
} else {
reset();
}
} else {
reset();
}
});
config.model.on('change:results', function(e, results){
if (results) {
var my_results = results[config.id],
visible_facets = state.selection;
if (my_results) {
visible_facets = _.union(visible_facets, my_results)
}
filter(visible_facets);
} else {
debug.log('alpha resetting!!')
reset();
}
});
}
}
function build() {
$content_switcher = $('');
$contents = $('');
$switch_navigation = $('');
var navigation_content = '
';
var letters = data.Roots;
if (config.include_trigger) {
var $trigger = $(dermquest.Settings.Templates.view_images);
$contents.append($trigger)
}
for (var i = 0, l = letters.length; i < l; i++) {
var id = letters[i],
letter = data.Facets[id],
element_id = 'alpha-' + letter.Text,
$content = $('');
navigation_content += '
';
$switch_navigation.append(navigation_content);
$content_switcher.append($switch_navigation, $contents);
$target.append($content_switcher, $no_facet_feedback);
}
function change(selection, active_list) {
if (config.limit === 1) {
for (var i = 0, l = lists.length; i < l; i++) {
var list = lists[i],
selection = list.getSelection();
if (list !== active_list) {
list.reset();
}
}
}
me.trigger('change');
}
function update(new_selection) {
state.selection = new_selection;
for (var i = 0, l = lists.length; i < l; i++) {
lists[i].update(new_selection);
}
}
function filter(active_facets) {
if (active_facets.length) {
var $menu_items = $switch_navigation.find('a');
for (var i = 0, l = lists.length; i < l; i++) {
var $menu_item = $menu_items.eq(i),
empty_list = lists[i].filter(active_facets);
if (empty_list) {
$menu_item.removeClass('enabled').addClass('disabled');
} else {
$menu_item.removeClass('disabled').addClass('enabled')
}
}
$content_switcher.show();
$no_facet_feedback.hide();
} else {
$content_switcher.hide();
$no_facet_feedback.show();
reset();
}
}
function focus() {}
function blur() {}
function getSelection() {
var selection = [];
for (var i = 0, l = lists.length; i < l; i++) {
var list_selection = lists[i].getSelection();
selection = _.union(selection, lists[i].getSelection())
}
state.selection = selection;
return state.selection;
}
function getState() {
getSelection();
return state;
}
function reset() {
var $menu_items = $switch_navigation.find('a')
$menu_items.addClass('enabled').removeClass('disabled');
$menu_items.eq(0).click();
for (var i = 0, l = lists.length; i < l; i++) {
lists[i].reset();
}
}
me.init = init;
me.update = update;
me.focus = focus;
me.blur = blur;
me.reset = reset;
me.getSelection = getSelection;
me.getState = getState;
init();
return me;
},
ResultListing: function(model) {
var me = _.extend({}, Backbone.Events);
var $wrapper = $('.image-listing-wrapper'),
$me = $wrapper.find('.image-listing'),
$case_summary_panel = $wrapper.find('.case-summary-panel').find('.panel-content');
var Pagination;
var image_item_template = Hogan.compile($("#image-listing-item").html()),
case_summary_template = Hogan.compile($("#case-summary-template").html());
var default_case_content;
function init() {
default_case_content = $case_summary_panel.html();
Pagination = new dermquest.Settings.Objects.Paging($wrapper.children('.c2'), model);
model.on("change:results", function() {
reset();
if (model.get('results')) {
update();
}
})
}
// Called to update the listing based on the contents of the State
function update() {
$me.trigger('update')
debug.time("refresh images")
var results = model.get('results');
if (results.Hits > 0 && results.Results.length > 0) {
var $results = $("
"),
images = results.Results;
for (var i = 0, l = images.length; i < l; i++) {
var image = images[i],
image_name = getImageName(image),
image_item_obj = {
'image_id': image.AssetId,
'case_id': image.Case,
'name': image_name,
'description': image.Description,
'src': image.FileName
},
case_summary_obj = {
'name': image_name,
'image_id': image.AssetId,
'image_rating': image.MemberRating,
'case_id': image.Case,
'age': image.AgeGroup,
'case_description': image.Description,
'dark_skin': image.DarkSkin,
'pregnant': image.Pregnant,
'immuno_suppression': image.ImmunoSuppression,
'member_rating': image.MemberRating,
'author': image.Author,
'sex': image.Sex
},
$image,
$case_summary;
if (image.isInMemberLocker) {
image_item_obj.in_locker = true;
} else {
image_item_obj.not_in_locker = true;
}
var keys = _.keys(model.get('data'));
for (var p = 0, pl = keys.length; p < pl; p++) {
var key = keys[p];
case_summary_obj[key] = formatFacetNames(key, image[key]);
}
$image = $(image_item_template.render(image_item_obj));
$case_summary = $(case_summary_template.render(case_summary_obj));
// Put a class on the last image in each row
if ((i + 1) % 4 === 0) {
$image.addClass("last")
}
$case_summary_panel.append($case_summary);
$results.append($image)
}
$me.html($results);
} else {
$me.html('
' + dermquest.Settings.Dictionary.no_results + '
');
}
me.trigger('loaded')
debug.timeEnd("refresh images")
}
function getImageName(image) {
var rtn = "",
key = 'diagnosis';
if (_.has(image, key)) {
if (image[key].length > 0) {
var id = image[key][0].Id,
diagnosis = model.get('data')[key].Facets[id];
if (diagnosis) {
rtn = diagnosis.Text.toTitle()
}
}
}
if (rtn.length === 0) {
rtn = image.Name
}
return rtn;
}
function formatFacetNames(collection_id, facets, index) {
var facet_collection = model.get('data')[collection_id].Facets;
facets = _.filter(facets, function(item){
return item.Id !== 0;
})
if (facets.length > 0) {
if (index !== undefined) {
return facet_collection[facets[index].Id].Text.toTitle();
} else if (facets.length === 1) {
return facet_collection[facets[0].Id].Text.toTitle();
} else {
var rtn = '
';
for (var i = 0, l = facets.length; i < l; i++) {
var facet = facet_collection[facets[i].Id];
if (facet) {
rtn += '