"
].join("\n");
var data_bind_template = function(template_html, data_map) {
jQuery.each(data_map, function(k,v) {
var k_re = new RegExp("\!\!" + k, 'g');
template_html = template_html.replace(k_re, v);
});
return template_html;
};
function load_widget_from_json($, result, script_obj) {
if (result.Error) {
if (console && console.log) {
console.log("Error while loading widget: " + result.Error);
};
return;
}
// get handle to the poll model
var data = result.poll_info;
var poll_url_key = data.url;
var poll_url = "http://www.massematics.com/q/" + poll_url_key;
// render the widget skeleton
var widget_map = {"title": data.question, "option_a": data.optionA, "option_b": data.optionB, "image": data.image_key};
var widget_html = data_bind_template(html_template, widget_map);
// place it in the dom
$(widget_html).insertAfter(script_obj);
// get a handle to the new element
var $widget_obj = script_obj.next();
// color overrides
var txt_color = script_obj.attr('data-color_text');
if (txt_color) {
$widget_obj.find(".poll_title").css("color", txt_color);
$widget_obj.find(".poll_vote_option").css("color", txt_color);
}
var bg_color = script_obj.attr('data-color_bg');
if (bg_color) {
$widget_obj.css("background-color", bg_color);
$widget_obj.find(".poll_title").css("background-color", bg_color);
$widget_obj.find(".widget_footer").css("background-color", bg_color);
}
var opt_a_color = script_obj.attr('data-color_opta');
if (opt_a_color) {
$widget_obj.find(".poll_option_a").css("background-color", opt_a_color);
}
var opt_b_color = script_obj.attr('data-color_optb');
if (opt_b_color) {
$widget_obj.find(".poll_option_b").css("background-color", opt_b_color);
}
// setup click handling for votes
$widget_obj.find(".poll_vote_option").click(function() {
var $vote_elem = $(this);
var vote_data = {
poll : script_obj.attr('poll'),
vote_value : $vote_elem.attr('data-vote')
};
__mm_call($widget_obj, "Vote", vote_data, null, function(vote_result) {
if (vote_result) {
// clear any existing vote states in this widget
$widget_obj.find(".current_vote").removeClass("current_vote");
// set current vote selection
$vote_elem.addClass("current_vote");
// adjust original vote totals (note: this assumes the user is a new voter and not switching votes)
if (vote_data.vote_value == 'A') {
data.voteTotalA += 1;
} else {
data.voteTotalB += 1;
}
// setup some render variables
var vote_total = parseFloat(data.voteTotalA) + parseFloat(data.voteTotalB);
var vote_pct_a = vote_total > 0 ? Math.round(1000.0*parseFloat(data.voteTotalA)/vote_total)/10 : 0;
var vote_pct_b = vote_total > 0 ? Math.round(10.0*parseFloat(100.0-vote_pct_a))/10 : 0;
// re-map the percentages to 100.0
var vote_pct_100_a = 0;
var vote_pct_100_b = 0;
if (vote_pct_a >= vote_pct_b) {
vote_pct_100_b = vote_pct_b * (100.0 / vote_pct_a);
vote_pct_100_a = 100.0;
} else {
vote_pct_100_a = vote_pct_a * (100.0 / vote_pct_b);
vote_pct_100_b = 100.0;
}
// render post-vote ui
var results_map = {
"vote_pct_a": vote_pct_a,
"vote_pct_b": vote_pct_b,
"vote_pct_normalized_a": vote_pct_100_a,
"vote_pct_normalized_b": vote_pct_100_b,
"vote_text_a": data.optionA,
"vote_text_b": data.optionB,
"vote_count_a": data.voteTotalA,
"vote_count_b": data.voteTotalB,
"poll_url": poll_url,
"poll_question": data.question,
"curr_vote_text": vote_data.vote_value == "A" ? data.optionA : data.optionB,
"curr_vote_pct": vote_data.vote_value == "A" ? vote_pct_a : vote_pct_b,
};
var results_screen_html = data_bind_template(result_screen_template, results_map);
$widget_obj.find(".result_screen_content").html(results_screen_html);
// show post-vote ui
$widget_obj.find(".js-requires-vote").show();
}
});
});
// setup click handling for getting next poll in sequence
$widget_obj.find(".poll_browse").click(function() {
__mm_call(null, "GetNextWidget", {poll:poll_url_key, sequence:"market"}, script_obj, function(result, script_obj) {
// remove the previous instance of the widget
script_obj.next().remove();
if (result && result.poll_info) {
// update script object attribute state to point to new poll
script_obj.attr('poll', result.poll_info.url);
}
// load the next one
load_widget_from_json($, result, script_obj);
});
});
}
function load_widget() {
jQuery(document).ready(function($) {
if (window.widget_loaded) {
// in case of multiple widgets, ignore duplicate document loads, the first one would've done all the work
return;
}
window.widget_loaded = true;
var css_link = $("", {
rel: "stylesheet",
type: "text/css",
href: "http://www.massematics.com/v2/default/css/widget.css"
});
css_link.appendTo('head');
var script_objs = $("script[poll]");
for (var i=0; i