/*************** SLIDER **************/ function FW_sliderUpdateLine(d) { for(var k=0; k<2; k++) { var name = "slider."+d[0]; if(k == 1) name = name+"-"+d[1].replace(/[ \d].*$/,''); el = document.getElementById(name); if(el) { var doSet = 1; // Only set the "state" slider in the detail view if(el.parentNode.getAttribute("name") == "val.set"+d[0]) { var el2 = document.getElementsByName("arg.set"+d[0])[0]; if(el2.nodeName.toLowerCase() == "select" && el2.options[el2.selectedIndex].value != "state") doSet = 0; } if(doSet) { var val = d[1].replace(/^.*?([.\-\d]+).*/g, "$1"); // get first number if(!val.match(/[.\-\d]+/)) val = 0; FW_sliderCreate(el, val); } } } } function FW_sliderCreate(slider, curr) { var sh = slider.firstChild; var lastX=-1, offX=0, maxX=0, val; var min = parseFloat(slider.getAttribute("min")); var stp = parseFloat(slider.getAttribute("stp")); var max = parseFloat(slider.getAttribute("max")); var cmd = slider.getAttribute("cmd"); function init() { maxX = slider.offsetWidth-sh.offsetWidth; if(curr) { offX += (curr-min)*maxX/(max-min); sh.innerHTML = curr; sh.setAttribute('style', 'left:'+offX+'px;'); } } init(); function touchFn(e, fn) { e.preventDefault(); // Prevents Safari from scrolling! if(e.touches == null || e.touches.length == 0) return; e.clientX = e.touches[0].clientX; fn(e); } function mouseDown(e) { var oldFn1 = document.onmousemove, oldFn2 = document.onmouseup, oldFn3 = document.ontouchmove, oldFn4 = document.ontouchend; if(maxX == 0) init(); lastX = e.clientX; function mouseMove(e) { var diff = e.clientX-lastX; lastX = e.clientX; offX += diff; if(offX < 0) offX = 0; if(offX > maxX) offX = maxX; val = min+(offX/maxX * (max-min)); val = Math.floor(Math.floor(val/stp)*stp); sh.innerHTML = val; sh.setAttribute('style', 'left:'+offX+'px;'); if(cmd && cmd.substring(0,3) == "js:") { eval(cmd.substring(3).replace('%',val)); } } document.onmousemove = mouseMove; document.ontouchmove = function(e) { touchFn(e, mouseMove); } document.onmouseup = document.ontouchend = function(e) { document.onmousemove = oldFn1; document.onmouseup = oldFn2; document.ontouchmove = oldFn3; document.ontouchend = oldFn4; if(cmd) { if(cmd.substring(0,3) != "js:") { if(typeof val != "undefined") document.location = cmd.replace('%',val); } } else { if(typeof val != "undefined") slider.nextSibling.setAttribute('value', val); } }; }; sh.onselectstart = function() { return false; } sh.onmousedown = mouseDown; sh.ontouchstart = function(e) { touchFn(e, mouseDown); } } function FW_sliderSelChange(name, devName, vArr) { if(vArr.length != 4 || vArr[0] != "slider") return undefined; var o = new Object(); var min=parseFloat(vArr[1]), stp=parseFloat(vArr[2]), max=parseFloat(vArr[3]); o.newEl = document.createElement('div'); o.newEl.innerHTML = '
'+min+'
'+ ''; FW_sliderCreate(o.newEl.firstChild, undefined); o.qFn = 'FW_querySetSlider(qArg, "%")'; o.qArg = o.newEl.firstChild; return o; } function FW_querySetSlider(el, val) { val = val.replace(/[^\d.\-]/g, ""); // remove non numbers FW_sliderCreate(el, val); } FW_widgets['slider'] = { updateLine:FW_sliderUpdateLine, selChange:FW_sliderSelChange };