function trace(o) { var s = ""; for(f in o) { s += f + ": " + o[f] + " "; } return s; }
/**
* TEST ELEMENT LOGIC:
*/
// Show preloader and start preparing the form.
$(document).ready(function() {
adjustModalWidth=function(){
var modalWidth=$('.jqmWindow').width();
var modalWidthHalf = modalWidth/2;
$('.jqmWindow').css({'margin-left' : -modalWidthHalf, 'position' : 'fixed'});
};
$('#ecotest-preloader').jqm({modal: true}).jqm({onShow:adjustModalWidth});
$('#ecotest-preloader').jqmShow();
setTimeout(ecotest_prepareForm, 10);
});
var ecotest_openpart = 0;
var ecotest_accordioning = false;
var ecotest_doneParts = [];
var ecotest_partElements = [];
// Prepares the test form.
function ecotest_prepareForm() {
// Add finer dot lines.
$(".area-header,.area-content").css("border-top", "none").before('
');
$(".field-line").css("border-bottom", "none").append('
');
if(ecotest_elements["isfirsttime"].value == 0) {
$(".extend-define,.extend-undefine,.repeat-define,.repeat-define-1").css("border-top", "none");
$(".extend-define:not(.hidden),.extend-undefine:not(.hidden),.repeat-define:not(.hidden), .repeat-define-1:not(.hidden)").before('
');
}
// Set up elements.
ecotest_elementSetup(ecotest_elements, null, null, null, false);
$(".info-hover").hover(ecotest_sideInfoShow, ecotest_sideInfoHide);
var part = 0;
var pdef = null;
for(var id in ecotest_elements) {
var def = ecotest_elements[id];
if(def.type == "is_done") {
part++;
ecotest_partElements[part] = [];
pdef = ecotest_elements["part"+part+"done"];
} else if(part > 0) {
ecotest_partElements[part].push(id);
def.part = part;
if(def.disable) {
ecotest_handleDisable(id, def.disable, def.value, true);
}
if(def.highlite && !pdef.highlite && ecotest_isvisible(id, def)) {
pdef.highlite = true;
$("#ecotest-title" + part).addClass("highlite");
//TODO imgTitleRebuild("#ecotest-title" + i, "h3", "h3", true);
}
}
}
// Set up accordion.
$("#ecotest-accordion .accordion-content").hide();
$("#ecotest-accordion .accordion-header").click(ecotest_accordionClick);
$("button.next").click(ecotest_nextPart);
$("button.submit").click(ecotest_submitForm).attr("disabled", "disabled").addClass("disabled");
ecotest_isPartsDone();
// Attach confirmation to non-test links and buttons.
$("#header a,#login a,#login button,#site-information a").click(
ecotest_confirmLeave);
// Remove preloader and show form.
$('#ecotest-preloader').jqmHide();
$("#ecotest-form").removeClass("transparent");
var i = ecotest_elements["openpart"].value;
if(i > 0) {
ecotest_partNoFocus = true;
ecotest_gotoPart(i);
}
}
// Sets up test elements or widgets.
function ecotest_elementSetup(elements, prefix, index, valueMap, enableSliders) {
for(var bid in elements) {
// Get element definition and figure out correct id, name and value.
var def = elements[bid];
var mid = bid;
if(prefix != null) {
mid = prefix + bid;
}
var name = def.name;
if(index != null) {
name = name.replace("#", index);
}
var value = 0;
if(valueMap != null && valueMap[bid] != undefined) {
value = valueMap[bid];
} else if(def.copy) {
value = ecotest_getDefVal(def.copy, ecotest_getElementDef(def.copy));
} else if(def.value) {
value = ecotest_getDefVal(mid, def);
}
ecotest_updateInitValue(mid, def, value);
// Set element attributes and attach listeners.
switch(def.type) {
case 'last_open_part':
case 'is_first_time':
$("#" + mid + "-value").attr("name", name).val(value);
break;
case 'highlite':
$("#" + mid + "-value").attr("name", name).val(value);
if(ecotest_elements["isfirsttime"].value != 0) {
break;
}
if(value.length > 0) {
var vs = value.split(",");
for(var i in vs) {
ecotest_elements[vs[i]].highlite = true;
}
}
break;
case 'is_done':
$("#" + mid + "-value").attr("name", name).val(value);
// Update the done parts array and part title if required.
var i = parseInt(mid.substr(4, 1));
if(value != 0) {
ecotest_partDone(i);
} else {
ecotest_doneParts[i - 1] = false;
}
break;
case 'number':
$("#" + mid + "-value").attr("name", name).val(value).change(ecotest_numberChange).keypress(ecotest_stopEnter).focus(ecotest_selectAll);
if(def.highlite) {
$("#"+mid+"-label,#"+mid+"-area").addClass("highlite");
}
break;
case 'checkbox':
$("#" + mid + "-value").styleCheckbox({name:name, cur:value, change:ecotest_checkboxChange});
if(def.highlite) {
$("#"+mid+"-label,#"+mid+"-area").addClass("highlite");
}
break;
case 'select':
if(def.build) {
$("#" + mid + "-select").styleSelect({name:name, opt:def.values, val:def.values, cur:value, change:ecotest_selectChange});
} else {
$("#" + mid + "-select").styleSelect({name:name, val:def.values, cur:value, change:ecotest_selectChange});
}
if(def.highlite) {
$("#"+mid+"-label,#"+mid+"-area").addClass("highlite");
}
break;
case 'radio':
$("#" + mid + "-radio").styleRadio({name:name, val:def.values, cur:value, change:ecotest_radioChange});
for(i in def.values) {
if(value == def.values[i]) {
def.lcur = def.cur = i;
if(def.periods) {
$("#" + mid + "-pointer").css("marginLeft", (110 + def.cur * 190) + "px");
}
}
}
if(def.highlite) {
$("#"+mid+"-label,#"+mid+"-area").addClass("highlite");
}
break;
case 'location':
var val = [];
var cur = 0;
for(var con in def.values) {
val.push(con);
for(var cou in def.values[con]) {
if(value == cou) {
cur = con;
break;
}
}
}
$("#continent-radio").styleRadio({ cur:cur, change:ecotest_locationContinent });
$("#location-select").attr("name", name).change(ecotest_locationChange);
ecotest_locationContinent(false);
break;
case 'slider':
// Leave hidden sliders freezed for IE to fix positioning bug.
if(!jQuery.browser.msie || enableSliders) {
ecotest_sliderIEfixRelease(mid);
}
$("#" + mid + "-value").attr("name", name).val(value).change(ecotest_sliderChange).keypress(ecotest_stopEnter).focus(ecotest_selectAll);
var lim = ecotest_getLimits(def);
$("#" + mid + "-slider").slider({id:mid, min:lim[2], max:lim[3], startValue:value, slide:ecotest_sliderEvent});
ecotest_sliderVisualize(mid, def, value);
$("#" + mid + "-average").click(ecotest_sliderAverage);
$("#" + mid + "-customval").click(ecotest_customval);
if(def.highlite) {
$("#"+mid+"-label,#"+mid+"-area").addClass("highlite");
}
break;
case 'extend':
if(ecotest_elements["isfirsttime"].value != 0) {
$("#" + mid + "-define,#" + mid + "-undefine,#" + mid + "-content").hide();
value = ecotest_updateValue(mid, def, 0);
$("#" + mid + "-value").attr("name", name).val(value);
break;
}
$("#" + mid + "-define").click(ecotest_extendDefine);
$("#" + mid + "-undefine").click(ecotest_extendUndefine);
$("#" + mid + "-value").attr("name", name).val(value);
if(value != 0) {
$("#" + mid + "-define").css("display", "none");
$("#" + mid + "-undefine").css("display", "block");
$("#" + mid + "-content").show();
} else {
$("#" + mid + "-define").css("display", "block");
$("#" + mid + "-undefine").css("display", "none");
$("#" + mid + "-content").hide();
}
if(def.highlite) {
$("#"+mid+"-define,#"+mid+"-undefine").addClass("highlite-bar")
$("#"+mid+"-content").addClass("highlite");
}
break;
case 'repeat':
if(ecotest_elements["isfirsttime"].value != 0 && def['extended'] == 1) {
$("#" + mid + "-define-1,#" + mid + "-define,#" + mid + "-block").hide();
break;
}
def.active = [];
$("#" + mid + "-define-1,#" + mid + "-define").click(ecotest_repeatAdd);
if(def.objects) {
for(var i in def.objects) {
ecotest_repeatNewBlock(bid, def.objects[i], false, i == 0);
}
if(def.objects.length > 0) {
$("#" + mid + "-define-1").css("display", "none");
$("#" + mid + "-define").css("display", "block");
} else {
$("#" + mid + "-define-1").css("display", "block");
$("#" + mid + "-define").css("display", "none");
}
}
if(def.highlite) {
$("#"+mid+"-define-1,#"+mid+"-define").addClass("highlite-bar");
$("#"+mid+"-block").addClass("highlite");
}
break;
case 'active':
$("#" + mid + "-value").attr("name", name).val(value);
break;
case 'group':
if(ecotest_elements["isfirsttime"].value != 0 && def['extended'] == 1) {
$("#" + mid).hide();
break;
}
if(def.highlite) {
$("#" + mid).addClass("highlite");
}
break;
}
// Convert from annual period when required.
if(def.period) {
ecotest_setPeriod(ecotest_getElementDef(def.period), mid);
}
}
}
// Moves to clicked test part or accordion.
function ecotest_accordionClick(event) {
event.preventDefault();
var t = $(this);
var i = parseInt(t.attr("id").substr(13));
if(i == ecotest_openpart) {
ecotest_gotoPart(0);
} else {
ecotest_gotoPart(i);
}
}
// Moves to the next test part or accordion.
function ecotest_nextPart(event) {
event.preventDefault();
ecotest_gotoPart(ecotest_openpart + 1);
}
// Opens the given part (or closes all with 0).
function ecotest_gotoPart(next) {
if(ecotest_accordioning) {
return;
}
ecotest_accordioning = true;
if(ecotest_openpart > 0) {
// Validate elements in the part.
var ems = ecotest_partElements[ecotest_openpart];
var error = false;
var hls = 0;
for(var j in ems) {
var bid = ems[j];
var def = ecotest_getElementDef(bid);
// Check that mandatory fields are set.
if(def.mandatory && (def.value == "" || def.value == 0)) {
error = true;
$("#" + bid + "-label").addClass("error-label");
} else {
$("#" + bid + "-label").removeClass("error-label");
}
// Remove seen highlites.
if(def.highlite && ecotest_isvisible(bid, def)) {
switch(def.type) {
case "group":
def.highlite = false;
$("#" + bid).removeClass("highlite");
break;
case "extend":
if(def.highliteSeen || def.value > 0) {
def.highlite = false;
$("#"+bid+"-define,#"+bid+"-undefine").removeClass("highlite-bar");
$("#"+bid+"-content").removeClass("highlite");
}
break;
case "repeat":
if(def.highliteSeen || def.value > 0) {
def.highlite = false;
$("#"+bid+"-define-1,#"+bid+"-define").removeClass("highlite-bar");
$("#"+bid+"-block").removeClass("highlite");
var rs = ecotest_getAllIds("_"+bid);
for(k in rs) {
$("#"+rs[k]+"block").removeClass("highlite");
}
}
break;
default:
def.highlite = false;
$("#"+bid+"-label,#"+bid+"-area").removeClass("highlite");
break;
}
if(def.highlite) {
hls++;
} else {
var hlstr = "";
var vs = ecotest_elements["highlite"].value.split(",");
for(var k in vs) {
if(vs[k] != bid) {
hlstr += ","+vs[k];
}
}
hlstr = hlstr.substr(1);
ecotest_elements["highlite"].value = hlstr;
$("#highlite-value").val(hlstr);
}
}
}
// Display error.
if(error) {
$("#ecotest-mandatory" + ecotest_openpart).addClass("error-label");
$("#ecotest-error" + ecotest_openpart).slideDown("fast");
ecotest_accordioning = false;
return;
} else {
$("#ecotest-mandatory" + ecotest_openpart).removeClass("error-label");
$("#ecotest-error" + ecotest_openpart).hide();
}
// Get definition for the open part.
var def = ecotest_elements["part" + ecotest_openpart + "done"];
// Remove part highlite.
if(def.highlite && hls == 0) {
def.highlite = false;
$("#ecotest-title" + ecotest_openpart).removeClass("highlite");
//TODO imgTitleRebuild("#ecotest-title" + i, "h3", "h3", true);
}
// Freeze exiting sliders for IE.
if(jQuery.browser.msie) {
// TODO loop all partElements and freeze by type
var ids = ecotest_fillAllIds(def.sliders);
for(j in ids) {
ecotest_sliderIEfixFreeze(ids[j]);
}
if(ecotest_openpart == 1) {
$("#continent-radio,#continent-holder").css("position","static");
}
}
// Accept part as done and start closing it.
$("#ecotest-part" + ecotest_openpart).slideUp("fast", ecotest_partClosed);
if(ecotest_partDone(ecotest_openpart)) {
ecotest_openpart = next;
ecotest_isPartsDone();
}
}
// Update the open part and start opening it.
ecotest_openpart = next;
$("#openpart-value").val(next);
if(next > 0) {
var t = $("#ecotest-title" + next);
if(t.hasClass("done")) {
t.addClass("open-done");
} else {
t.addClass("open");
}
$("#ecotest-part" + next).slideDown("fast", ecotest_partOpened);
}
}
// Invoked when part is closed.
function ecotest_partClosed() {
var t = $(this);
var i = parseInt(t.attr("id").substr(12));
$("#ecotest-title" + i).removeClass("open").removeClass("open-done");
ecotest_accordioning = false;
}
var ecotest_partNoFocus = false;
// Invoked when part is opened.
function ecotest_partOpened() {
// Release entered sliders for IE.
if(jQuery.browser.msie) {
// TODO loop all partElements and release by type
var def = ecotest_elements["part" + ecotest_openpart + "done"];
var ids = ecotest_fillAllIds(def.sliders);
for(i in ids) {
if(!$("#"+ids[i]+"-area").hasClass("disabled")) {
ecotest_sliderIEfixRelease(ids[i]);
}
}
if(ecotest_openpart == 1) {
$("#continent-holder").css("position","relative");
$("#continent-radio").css("position","absolute");
}
}
// Try to fix strange bug.
$("#ecotest-part" + ecotest_openpart + "-next").removeAttr("disabled");
if(ecotest_partNoFocus) {
ecotest_partNoFocus = false;
} else {
window.location = "#p" +ecotest_openpart;
}
ecotest_accordioning = false;
}
// Shows the submit info and starts the real submit.
function ecotest_submitForm(event) {
event.preventDefault();
$('#ecotest-sending').jqm({modal: true}).jqm({onShow:adjustModalWidth});
$('#ecotest-sending').jqmShow();
setTimeout(ecotest_submitFormReal, 10);
}
// Really submits the form to backend.
function ecotest_submitFormReal() {
$("#ecotest-accordion .accordion-header").unbind('click', ecotest_accordionClick);
ecotest_gotoPart(0);
// Update annual values from definition to form and enable everything.
for(bid in ecotest_elements) {
var def = ecotest_elements[bid];
if(def.type == "repeat" && def.active) {
for(j in def.active) {
if(def.active[j]) {
for(f in def.fields) {
var mid = "_" + bid + "-" + j + "_" + f;
var fdef = def.fields[f];
if(fdef.period) {
var v = ecotest_getLimitedNumber(ecotest_getDefVal(mid, fdef),
[fdef.limit[4], fdef.limit[5], null, null, fdef.usefloat]);
$("#" + mid + "-value").val(v);
}
if(fdef.disablers) {
ecotest_enableElement(mid, fdef);
}
}
}
}
} else {
if(def.period) {
var v = ecotest_getLimitedNumber(ecotest_getDefVal(bid, def),
[def.limit[4], def.limit[5], null, null, def.usefloat]);
$("#" + bid + "-value").val(v);
}
if(def.disablers) {
ecotest_enableElement(bid, def);
}
}
}
// Submit the form.
$("#ecotest-form").get(0).submit();
//$("#ecotest-form").html($("#ecotest-form").serialize());
}
// Confirms leaving from unfinished form.
function ecotest_confirmLeave(event) {
var clickedLink = $(this).parent().attr("class");
if(clickedLink=='languageselect'){return false;}
if(!confirm($("#ecotest-leaving p").text())) {
event.preventDefault();
}
}
// Updates a part to done state.
function ecotest_partDone(i) {
if(ecotest_doneParts[i - 1]) {
return false;
}
ecotest_doneParts[i - 1] = true;
ecotest_elements["part" + i + "done"]["value"] = 1;
$("#part" + i + "done-value").val(1);
$("#ecotest-title" + i).addClass("done");
//TODO imgTitleRebuild("#ecotest-title" + i, "h3", "h3", true);
return true;
}
// Checks if all test parts are done.
function ecotest_isPartsDone() {
var doneCount = 0;
var missPart = 0;
for(var i = 0; i < ecotest_doneParts.length; i++) {
if(ecotest_doneParts[i]) {
doneCount++;
} else {
missPart = i + 1;
}
}
if(doneCount == ecotest_doneParts.length
|| (doneCount == ecotest_doneParts.length - 1 && missPart == ecotest_openpart)) {
$("button.submit").removeAttr("disabled").removeClass("disabled");
}
}
/**
* UTILITIES
*/
// Gets base element id.
function ecotest_getBaseId(id, ext) {
return id.substr(0, id.length - ext.length);
}
// Checks if base element id belongs to a repeat (is of style: _car-0_active).
function ecotest_isRepeatId(bid) {
return bid.charAt(0) == '_';
}
// Divides repeat element id to repeat and child id (from style: _car-0_active to car and active).
function ecotest_getRepeatAndChildId(bid) {
var rid = "";
var cid = "";
var num = NaN;
var i = bid.indexOf("_", 1);
if(i > 0) {
rid = bid.substring(1, i);
cid = bid.substr(i + 1);
} else {
rid = bid.substr(1);
}
i = rid.indexOf("-");
if(i > 0) {
num = parseInt(rid.substr(i + 1));
rid = rid.substring(0, i);
}
return [rid, cid, num];
}
// Adds possible repeat ids to an id.
function ecotest_getAllIds(bid) {
if(ecotest_isRepeatId(bid)) {
var ids = ecotest_getRepeatAndChildId(bid);
var def = ecotest_getElementDef(ids[0]);
var res = [];
for(var i in def.active) {
if(def.active[i]) {
res.push("_" + ids[0] + "-" + i + "_" + ids[1]);
}
}
return res;
}
return [bid];
}
// Fills possible repeat ids to an array of ids.
function ecotest_fillAllIds(arr) {
var res = [];
for(i in arr) {
res = res.concat(ecotest_getAllIds(arr[i]));
}
return res;
}
// Gets the element definition. Always use this to get elements inside repeats correctly.
function ecotest_getElementDef(bid) {
if(ecotest_isRepeatId(bid)) {
var ids = ecotest_getRepeatAndChildId(bid);
return ecotest_elements[ids[0]].fields[ids[1]];
}
return ecotest_elements[bid];
}
// Gets the limits in current period.
function ecotest_getLimits(def) {
var i = 0;
if(def.period) {
var perdef = ecotest_getElementDef(def.period);
i = perdef.cur * 2;
}
res = [def.limit[i + 0], def.limit[i + 1]];
if(def.scale) {
res[2] = def.scale[i + 0];
res[3] = def.scale[i + 1];
}
if(def.usefloat) {
res[4] = true;
} else {
res[4] = false;
}
return res;
}
// Gets integer value in limits.
function ecotest_getLimitedNumber(val, lim) {
var v = "" + val;
if(lim[4]) {
v = parseFloat(v.replace(",", ".")).toFixed(2);
} else {
v = parseInt(v);
}
if(isNaN(v)) {
v = 0;
}
if(v < lim[0]) {
v = lim[0];
} else if(v > lim[1]) {
v = lim[1];
}
return v;
}
// Sets full value using the biggest period to the element definition.
function ecotest_setDefVal(bid, def, v, noPeriod) {
var rv = v;
if(!noPeriod && def.period && def.relation) {
var pdef = ecotest_getElementDef(def.period);
rv = v / def.relation[pdef.cur] * def.relation[def.relation.length - 1];
}
if(ecotest_isRepeatId(bid)) {
var ids = ecotest_getRepeatAndChildId(bid);
var rdef = ecotest_getElementDef(ids[0]);
if(!rdef.objects) {
rdef.objects = [];
}
if(!rdef.objects[ids[2]]) {
rdef.objects[ids[2]] = {};
}
rdef.objects[ids[2]][ids[1]] = rv;
} else {
def.value = rv;
}
}
// Gets the full value.
function ecotest_getDefVal(bid, def) {
if(ecotest_isRepeatId(bid)) {
var ids = ecotest_getRepeatAndChildId(bid);
var rdef = ecotest_getElementDef(ids[0]);
if(!rdef.objects) {
return 0;
}
if(!rdef.objects[ids[2]]) {
return 0;
}
return rdef.objects[ids[2]][ids[1]];
} else {
return def.value;
}
}
// Updates an initial element value.
function ecotest_updateInitValue(bid, def, value) {
ecotest_setDefVal(bid, def, value, true);
if(def.show) {
ecotest_handleShow(def.show, value);
}
if(def.hide) {
ecotest_handleHide(def.hide, value);
}
if(def.trigger) {
if(value > 0) {
ecotest_hiddenShow(def.trigger);
} else {
ecotest_hiddenHide(def.trigger);
}
}
}
// Checks value and updates it to the element definition.
function ecotest_updateValue(bid, def, value) {
var v = value;
if(def.limit) {
var lim = ecotest_getLimits(def);
v = ecotest_getLimitedNumber(value, lim);
}
ecotest_setDefVal(bid, def, v, false);
if(def.show) {
ecotest_handleShow(def.show, v);
}
if(def.hide) {
ecotest_handleHide(def.hide, v);
}
if(def.disable) {
ecotest_handleDisable(bid, def.disable, v, false);
}
if(def.trigger) {
if(v > 0) {
ecotest_hiddenShow(def.trigger);
} else {
ecotest_hiddenHide(def.trigger);
}
}
return v;
}
// Handles the show attribute in element definition.
function ecotest_handleShow(show, active) {
var showsel = false;
for(var i in show) {
if(i == active) {
showsel = show[i];
} else {
$(show[i]).hide();
}
}
if(showsel) {
$(showsel).show();
}
}
// Handles the hide attribute in element definition.
function ecotest_handleHide(hide, active) {
var hidesel = false;
for(var i in hide) {
if(i == active) {
hidesel = hide[i];
} else {
$(hide[i]).show();
}
}
if(hidesel) {
$(hidesel).hide();
}
}
// Handles the disable attribute in element definition.
function ecotest_handleDisable(did, disable, active, init) {
for(var bid in disable) {
var def = ecotest_getElementDef(bid);
if(!def.disablers) {
def.disablers = {};
}
var dis = false;
var vs = disable[bid];
if(vs == '_nonzero') {
dis = (active != 0);
} else {
for(var j in vs) {
if(vs[j] == active) {
dis = true;
}
}
}
if(dis) {
def.disablers[did] = true;
switch(def.type) {
case "number":
$("#"+bid+"-value").attr("disabled", "disabled");
break;
case "slider":
if(jQuery.browser.msie) {
ecotest_sliderIEfixFreeze(bid);
}
$("#"+bid+"-slider").slider("disable");
$("#"+bid+"-value,#"+bid+"-customval,#"+bid+"-average").attr("disabled", "disabled");
break;
case "checkbox":
$("#"+bid+"-value").styleDisable();
break;
}
$("#"+bid+"-area").addClass("disabled").fadeTo("fast", 0.4);
} else if(!init) {
def.disablers[did] = false;
var enable = true;
for(var j in def.disablers) {
if(def.disablers[j]) {
enable = false;
}
}
if(enable) {
ecotest_enableElement(bid, def);
}
}
}
}
// Enables a disabled element.
function ecotest_enableElement(bid, def) {
switch(def.type) {
case "number":
$("#"+bid+"-value").removeAttr("disabled");
break;
case "slider":
if(jQuery.browser.msie) {
ecotest_sliderIEfixRelease(bid);
}
$("#" + bid + "-slider").slider("enable");
$("#" + bid + "-value,#"+bid+"-customval,#"+bid+"-average").removeAttr("disabled");
break;
case "checkbox":
$("#"+bid+"-value").styleEnable();
break;
}
$("#"+bid+"-area").removeClass("disabled").fadeTo("fast", 1);
}
// Sets given attribute for given class and removes the class.
function ecotest_classToAtr(jqueryObject, baseCls, atrName, baseAtr, postfixes) {
for(var i in postfixes) {
var cls = baseCls + postfixes[i];
jqueryObject.find("." + cls).attr(atrName, baseAtr + postfixes[i]).removeClass(cls);
}
}
// Stops and ignores an enter event.
function ecotest_stopEnter(event) {
if(event.keyCode == 13) {
event.preventDefault();
event.stopPropagation();
$(this).change();
}
}
// Selects the field contents on focus.
function ecotest_selectAll(event) {
$(this).get(0).select();
}
/**
* FIELDS, CHECKBOXES, SELECTS
*/
// Number field changed.
function ecotest_numberChange(event) {
var t = $(this);
var bid = ecotest_getBaseId(t.attr("id"), "-value");
var def = ecotest_getElementDef(bid);
var v = ecotest_updateValue(bid, def, t.val());
t.val(v);
}
// Checkbox changed.
function ecotest_checkboxChange(event) {
var t = $(this);
var bid = ecotest_getBaseId(t.parent(".ui-checkbox").attr("id"), "-value");
var def = ecotest_getElementDef(bid);
var v = ecotest_updateValue(bid, def, t.val());
}
function ecotest_selectChange(event) {
var t = $(this);
var bid = ecotest_getBaseId(t.parent(".ui-select").attr("id"), "-select");
var def = ecotest_getElementDef(bid);
if (def.customupdate) {
for(elem in def.customupdate) {
var externalParams = {newtype:t.val()}
ecotest_customvalManual(def.customupdate[elem],externalParams)
}
}
ecotest_updateValue(bid, def, t.val());
}
/**
* RADIOS
*/
// Radio option changed.
function ecotest_radioChange(event) {
var t = $(this);
var bid = ecotest_getBaseId(t.parent(".ui-radio").attr("id"), "-radio");
var def = ecotest_getElementDef(bid);
var v = ecotest_updateValue(bid, def, t.val());
// Update selected index.
def.lcur = def.cur;
for(i in def.values) {
if(def.values[i] == v) {
def.cur = i;
}
}
// Update periodic fields.
if(def.periods) {
var per = ecotest_fillAllIds(def.periods);
for(i in per) {
ecotest_setPeriod(def, per[i]);
}
$("#" + bid + "-pointer").animate({marginLeft: (110 + def.cur * 190) + "px"}, "fast");
}
}
// Sets a new period.
function ecotest_setPeriod(pdef, bid) {
var def = ecotest_getElementDef(bid);
var t = $("#" + bid + "-value");
var v = t.val();
var lim = ecotest_getLimits(def);
var rv = ecotest_getDefVal(bid, def);
if(def.relation) {
v = Math.round(rv / def.relation[def.relation.length - 1] * def.relation[pdef.cur]);
}
v = ecotest_getLimitedNumber(v, lim);
if(v == 0 && rv > 0) {
t.val('< 1');
} else {
t.val(v);
}
switch(def.type) {
case "slider":
$("#" + bid + "-slider").slider("destroy").slider({id:bid, min:lim[2], max:lim[3], startValue:v, slide:ecotest_sliderEvent});
ecotest_sliderVisualize(bid, def, v);
break;
}
}
/**
* LOCATION
*/
function ecotest_locationContinent(event) {
var con = "";
if(event) {
con = $(this).val();
} else {
con = $("#continent-radio input[type='hidden']").val();
}
var def = ecotest_elements["location"];
if(!def.values[con]) {
return;
}
var val = def.values[con];
var sortable = [];
for (var cou in val)
sortable.push([cou, val[cou]])
sortable.sort(function(a, b) {return a[1] > b[1]})
var cur = def.value;
var opt = "";
for(i=0;i'+sortable[i][1]+'';
}
$("#location-select").html(opt);
}
function ecotest_locationChange(event) {
ecotest_updateValue("location", ecotest_elements["location"], $(this).val());
}
/**
* SLIDERS
*/
var ecotest_sliderMissNext = false;
// Releases an IE slider fix.
function ecotest_sliderIEfixRelease(bid) {
$("#" + bid + "-slider").css("position", "relative").find(".ui-slider-handle").css("position", "absolute").show();
}
// Freezes an IE slider to keep slider in correct place inside accordion.
function ecotest_sliderIEfixFreeze(bid) {
$("#" + bid + "-slider").css("position", "static").find(".ui-slider-handle").css("position", "static").hide();
}
// Slider event callback.
function ecotest_sliderEvent(event, ui) {
if(!ecotest_sliderMissNext) {
var def = ecotest_getElementDef(ui.options.id);
var v = ecotest_updateValue(ui.options.id, def, ui.value);
$("#" + ui.options.id + "-value").val(v);
ecotest_sliderVisualize(ui.options.id, def, v);
}
ecotest_sliderMissNext = false;
}
// Slider field changed.
function ecotest_sliderChange(event) {
var t = $(event.target);
var bid = ecotest_getBaseId(t.attr("id"), "-value");
var def = ecotest_getElementDef(bid);
var v = t.val();
ecotest_sliderSet(bid, def, v);
}
// Sets slider to average value.
function ecotest_sliderAverage(event) {
event.preventDefault();
var t = $(this);
var bid = ecotest_getBaseId(t.attr("id"), "-average");
var def = ecotest_getElementDef(bid);
ecotest_sliderSet(bid, def, def.average);
}
// Sets value of the slider.
function ecotest_sliderSet(bid, def, val) {
var v = ecotest_updateValue(bid, def, val);
ecotest_sliderMissNext = true;
$("#" + bid + "-slider").slider("moveTo", v);
$("#" + bid + "-value").val(v);
ecotest_sliderVisualize(bid, def, v);
}
// Updates the slider visualization.
function ecotest_sliderVisualize(bid, def, val) {
if(!def.visualize) {
return;
}
var vis = $("#" + bid + "-visualize");
// Make days selected visualization.
if(def.visualize == "day") {
var pdef = ecotest_getElementDef(def.period);
var fill = 7;
if(pdef.cur > 0) {
fill = 30;
}
var reps = vis.find(".ui-visualize");
if(reps.length != fill) {
var html = "";
for(var i = 0; i < fill; i++) {
html += '
\n';
}
vis.html(html);
if(fill > 7) {
vis.addClass("small-day-visualize");
} else {
vis.removeClass("small-day-visualize");
}
reps = vis.find(".ui-visualize");
}
reps.slice(0, val).removeClass("dayplace").addClass("day");
reps.slice(val).removeClass("day").addClass("dayplace");
return;
}
// Make normal growing visualization.
var reps = vis.find(".ui-visualize");
if(reps.length > val) {
reps.slice(val).remove();
if(val == 0) {
vis.html(' ');
}
} else if(reps.length < val) {
var html = "";
for(var i = reps.length; i < val; i++) {
html += '
\n';
}
if(reps.length == 0) {
vis.html(html);
} else {
vis.append(html);
}
}
var small = 15;
if(vis.hasClass("mid-visualize")) {
small = 10;
}
if(val > small) {
vis.addClass("small-visualize");
} else {
vis.removeClass("small-visualize");
}
}
/**
* EXTENDED OR HIDDEN SECTIONS
*/
// Defines extended section.
function ecotest_extendDefine(event) {
event.preventDefault();
var t = $(this);
var bid = ecotest_getBaseId(t.attr("id"), "-define");
var def = ecotest_getElementDef(bid);
var v = ecotest_updateValue(bid, def, 1);
t.css("display", "none");
$("#" + bid + "-value").val(v);
$("#" + bid + "-undefine").css("display", "block");
$("#" + bid + "-content").slideDown("fast");
if(def.highlite) {
def.highliteSeen = true;
}
}
// Undefines extended section.
function ecotest_extendUndefine(event) {
event.preventDefault();
var t = $(this);
var bid = ecotest_getBaseId(t.attr("id"), "-undefine");
var def = ecotest_getElementDef(bid);
var v = ecotest_updateValue(bid, def, 0);
t.css("display", "none");
$("#" + bid + "-value").val(v);
$("#" + bid + "-define").css("display", "block");
$("#" + bid + "-content").slideUp("fast");
if(def.highlite) {
def.highliteSeen = true;
}
}
// Show a hidden section.
function ecotest_hiddenShow(bid) {
$("#" + bid + "-content").show();
$("#" + bid + "-value").val(1);
// Highlite part if first highlited element is shown.
var def = ecotest_getElementDef(bid);
ecotest_updateValue(bid, def, 1);
if(def.highlite && def.part) {
var pdef = ecotest_getElementDef("part"+def.part+"done");
if(!pdef.highlite) {
pdef.highlite = true;
$("#ecotest-title" + def.part).addClass("highlite");
//TODO imgTitleRebuild("#ecotest-title" + i, "h3", "h3", true);
}
}
}
// Hides a hidden section.
function ecotest_hiddenHide(bid) {
$("#" + bid + "-content").hide();
$("#" + bid + "-value").val(0);
// Unhighlite part if last highlited element is removed.
var def = ecotest_getElementDef(bid);
ecotest_updateValue(bid, def, 0);
if(def.highlite && def.part) {
var pdef = ecotest_getElementDef("part"+def.part+"done");
var ems = ecotest_partElements[def.part];
for(var j in ems) {
var jid = ems[j];
var jdef = ecotest_getElementDef(jid);
if(jdef.highlite && ecotest_isvisible(jid, jdef)) {
return;
}
}
pdef.highlite = false;
$("#ecotest-title" + def.part).removeClass("highlite");
//TODO imgTitleRebuild("#ecotest-title" + i, "h3", "h3", true);
}
}
// Tries to figure out if element is visible.
function ecotest_isvisible(bid, def) {
if(bid == "energy2" && def.value == 0) {
return false;
} else if(bid == "sources2" && ecotest_elements["energy2"].value == 0) {
return false;
} else if(bid == "omni" && ecotest_elements["diet"].cur != 0) {
return false;
} else if(bid == "vege" && ecotest_elements["diet"].cur != 1) {
return false;
}
return true;
}
/**
* REPEATED SECTIONS
*/
// Adds a new repeated element.
function ecotest_repeatAdd(event) {
event.preventDefault();
var t = $(this);
var bid = null;
var first = null;
if(t.hasClass("repeat-define-1")) {
bid = ecotest_getBaseId(t.attr("id"), "-define-1");
first = true;
// Use another title if one or more repeats exist.
t.css("display", "none");
$("#" + bid + "-define").css("display", "block");
} else {
bid = ecotest_getBaseId(t.attr("id"), "-define");
first = false;
}
var def = ecotest_getElementDef(bid);
if (def.init) {
ecotest_repeatNewBlock(bid, def.init, true, first);
} else {
ecotest_repeatNewBlock(bid, null, true, first);
}
if(def.highlite) {
def.highliteSeen = true;
}
}
// Copies and sets up a repeat block.
function ecotest_repeatNewBlock(bid, valueMap, enableSliders, isFirst) {
var def = ecotest_getElementDef(bid);
// Find free repeat index inside the max limit.
var i = 0;
while(def.active[i]) {
i++;
}
if(i >= def.limit[1]) {
return false;
}
def.active[i] = true;
var v = 0;
if(def.value) {
v = def.value;
}
ecotest_updateValue(bid, def, v + 1);
// Copy from repeat block source in dom and generate element ids of style: _car-0_active-value
var base = "_" + bid + "-" + i;
var pt = $('#' + bid + "-block");
pt.before(''+pt.html()+'
');
var b = $('#' + base + '_block');
if(pt.hasClass("highlite")) {
b.addClass("highlite");
}
b.find(".repeat-content").slideDown("fast");//b.find(".repeat-content").show();
for(name in def.fields) {
var cdef = def.fields[name];
var cls = bid + "-" + name + "-";
var id = base + "_" + name + "-";
switch(cdef.type) {
case 'active':
case 'number':
case 'checkbox':
ecotest_classToAtr(b, cls, "id", id, ["value"]);
break;
case 'select':
ecotest_classToAtr(b, cls, "id", id, ["select"]);
break;
case 'radio':
ecotest_classToAtr(b, cls, "id", id, ["radio"]);
var vals = [];
for(var j in cdef.values) {
vals.push(j);
}
ecotest_classToAtr(b, cls, "id", id, vals);
ecotest_classToAtr(b, "for-" + cls, "for", id, vals);
break;
case 'slider':
ecotest_classToAtr(b, cls, "id", id, ["slider", "value", "average"]);
break;
case 'extend':
ecotest_classToAtr(b, cls, "id", id, ["value", "define", "undefine", "content"]);
break;
}
}
// Do element setup inside the new repeat block.
if(isFirst) {
b.find(".repeat-button").attr("id", bid + "-define").click(ecotest_repeatAdd);
b.find(".not-in-first").remove();
} else {
b.find(".repeat-button,.only-in-first").remove();
}
b.find(".repeat-undefine,.repeat-del").attr("id", base + "_delete").click(ecotest_repeatDel);
b.find(".repeat-undefine").css("border-top", "none").before('
');
ecotest_elementSetup(def.fields, base + "_", i, valueMap, enableSliders);
return true;
}
// Deletes a repeated element.
function ecotest_repeatDel(event) {
event.preventDefault();
var t = $(this);
var ids = ecotest_getRepeatAndChildId(t.attr("id"));
// Mark the repeat index free and count remaining repeat blocks.
var def = ecotest_getElementDef(ids[0]);
def.active[ids[2]] = false;
ecotest_updateValue(ids[0], def, def.value - 1);
// Use another title if no repeats exist.
if(def.value <= 0) {
$("#" + ids[0] + "-define").css("display", "none");
$("#" + ids[0] + "-define-1").css("display", "block");
}
// Slide block closed.
$("#_" + ids[0] + "-" + ids[2] + "_block").slideUp("fast", ecotest_repeatBlockDel);
if(def.highlite) {
def.highliteSeen = true;
}
}
// Deletes the repeated element dom block.
function ecotest_repeatBlockDel() {
$(this).remove();
}
/**
* SIDE INFOS
*/
function ecotest_sideInfoShow(event) {
$(this).find(".info-pointer,.area-side-info").fadeIn("fast");
}
function ecotest_sideInfoHide(event) {
$(this).find(".info-pointer,.area-side-info").fadeOut("fast");
}
/**
* CUSTOM ACTIONS
*/
ecotest_customactions = {
'heatingannual':{method:ecotest_calcnewheating,params:{target:'heatingannual',type:'heatingsystem',numPersons:'persons1',housingType:'housingtype1',area:'livingspace1'}},
'heatingannual2':{method:ecotest_calcnewheating,params:{target:'heatingannual2',type:'heatingsystem2',numPersons:'persons2',housingType:'housingtype2',area:'livingspace2'}},
'energyannual':{method:ecotest_calcenergyavg,params:{target:'energyannual',numPersons:'persons1'}},
'energyannual2':{method:ecotest_calcenergyavg,params:{target:'energyannual2',numPersons:'persons2'}},
'heatingsystem':{method:ecotest_calcnewheating,params:{target:'heatingannual',type:'heatingsystem',numPersons:'persons1',housingType:'housingtype1',area:'livingspace1'}},
'heatingsystem2':{method:ecotest_calcnewheating,params:{target:'heatingannual2',type:'heatingsystem2',numPersons:'persons2',housingType:'housingtype2',area:'livingspace2'}}
};
//Need target, numPersons
function ecotest_calcenergyavg(params) {
var avg = 1700*params.numPersons
var def = ecotest_getElementDef(params.target);
ecotest_sliderSet(params.target, def, avg);
}
//Needs target, type, housingType,area,numPersons. Used for average
//newtype case if the value should be updated when heatingtype changes
function ecotest_calcnewheating(params) {
if (params.newtype) { //estimate new value
var sliderElem = ecotest_getElementDef(params.target);
if (params.type && ecotest_heatingfactors[params.type] && params.housingType && ecotest_heatingfactors[params.newtype]) {
var newTypeFactor = ecotest_heatingfactors[params.newtype]['factors'][params.housingType];
var currTypeFactor = ecotest_heatingfactors[params.type]['factors'][params.housingType];
var val = sliderElem.value*(newTypeFactor/currTypeFactor);
} else {
var val = 0;
}
ecotest_sliderSet(params.target, sliderElem, val);
} else {
if (params.type && ecotest_heatingfactors[params.type] && params.housingType) {
var factor = ecotest_heatingfactors[params.type]['factors'][params.housingType];
var val = params.area*factor;
var def = ecotest_getElementDef(params.target);
ecotest_sliderSet(params.target, def, val);
}
}
}
function ecotest_customval(event) {
event.preventDefault();
var t = $(this);
var bid = ecotest_getBaseId(t.attr("id"), "-customval");
ecotest_customvalManual(bid, false);
}
function ecotest_customvalManual(bid,externalVals) {
var action = ecotest_customactions[bid];
var params = action['params'];
var paramVals = new Object();
for (key in params) {
if (key != 'target') {
var val = ecotest_getElementDef(params[key]).value
}else {
var val = params[key]
}
paramVals[key] = val
}
if (externalVals) {
for (key in externalVals) {
paramVals[key] = externalVals[key]
}
}
action.method(paramVals);
}