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'; } $("#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); }