// Copyright 1998,1999 Macromedia, Inc. All rights reserved. //Constructs a slider element function MM_sldr(theParent, theName, theInitVal,theMin,theMax,theUseFloat,theIsVertical) { // properties this.initialValue = Math.min(Math.max(Math.min(theMin,theMax),theInitVal), Math.max(theMax,theMin)); //keep in legal range, may be reversed this.value = ''; this.disabled = true; this.min = theMin; this.max = theMax; this.useFloat = theUseFloat; this._parent = theParent; this._name = theName; this._obj = ''; this._isVertical = theIsVertical; this._trkObj = ''; this._txtObj = ''; this._trackLen = 0; this._trackPos = 0; this._self = theParent._self+".e['"+theName+"']"; this.c = new Array(); // member functions this.reset = MM_sldrReset; this.init = MM_sldrInit; this.enable = MM_sldrEnable; this.disable = MM_sldrDisable; this.setDisabled = MM_sldrSetDisabled; this.update = MM_sldrUpdate; this.setValue = MM_sldrSetValue; } //Resets the element function MM_sldrReset() { var i, NS = (navigator.appName == "Netscape"); if (this._obj) with (this) { if (_parent.disabled) disable(); else enable(); value = initialValue; for (i in c) c[i].validValue(); if (_txtObj) _txtObj.value = initialValue; //load text object if there setValue(initialValue); } } //Enables the element function MM_sldrEnable() { if (this._obj) with (this) { disabled = false; _obj.MM_dragOk = true; } } //Disables the element function MM_sldrDisable() { this.disabled = true; this._obj.MM_dragOk = null; } //Calls the approppriate disable or enable function function MM_sldrSetDisabled(theDisabled) { if (theDisabled) this.disable(); else this.enable(); } //Called when the layer is dragged or dropped, updates all values. function MM_sldrUpdate(dragging) { var i; if (!this.disabled) with (this) { if (_isVertical) value = (min+((max-min)*(_trackLen-_obj.MM_UPDOWN-_trackPos)/_trackLen)); else value = (min+(max-min)*(1-(_trackLen-_obj.MM_LEFTRIGHT-_trackPos)/_trackLen)); if (!useFloat) value = Math.round(value); if (dragging) { if (_txtObj) _txtObj.value = value; if (this.onDrag != null) onDrag(_parent._self+_name, value); } else { for (i in c) c[i].validValue(); // walk choices, setting selected if (this.onDrop != null) onDrop(_parent._self+_name, value); _parent.update(); // call the parent's update } } } //Initializes slider objects. Looks for drag thumb, track image, and optional textbox. //Makes the layer draggable by calling MM_dragLayer. function MM_sldrInit() { var baseName,thm,diff,U=0,D=0,L=0,R=0,NS = (navigator.appName == "Netscape"); with (this) { baseName = _parent._self+_name; //assemble base name _obj = MM_intFindObject(baseName+"Inp"); //find slider layer object thm = MM_intFindObject(baseName+"Thm"); //find slider layer object if (_obj && thm) { if (_parent.browserIsIE && _parent.osIsMac) { _obj.style.width = ""; _obj.style.height = ""; thm.style.width = ""; thm.style.height = ""; } _trkObj = MM_intFindObject(baseName+'Trk'); //find trk image object if (_trkObj) { _txtObj = MM_intFindObject(baseName+'Val'); //find optional output textfield obj _trackLen = Math.max(((_isVertical)? ((NS)?_trkObj.height-thm.height : _trkObj.height-thm.height): ((NS)?_trkObj.width-thm.width : _trkObj.width-thm.width)),1); diff = this.max-this.min; _trackPos = Math.round(((this.initialValue - this.min)/((diff)?diff:1))*_trackLen); if (_isVertical) _trackPos = _trackLen - _trackPos; setValue(this.initialValue); if (_isVertical) {U = _trackPos; D = _trackLen-_trackPos;} else {L = _trackPos; R = _trackLen-_trackPos;} MM_dragLayer(baseName+"Inp",'',0,0,0,0,false,false,U,D,L,R,false,false,0, _self+'.update()',true,_self+'.update(true)'); } } } } //Moves the drag thumb to the given position. function MM_sldrSetValue(newValue) { var i, newPos, diff, newPos, posObj, NS = (navigator.appName == "Netscape"); with (this) { newValue = Math.min(Math.max(Math.min(min,max),newValue), Math.max(max,min)); //keep in legal range, may be reversed diff = max-min; newPos = Math.round(((newValue - min)/((diff)?diff:1))*_trackLen); if (_isVertical) newPos = _trackLen - newPos; posObj = (NS)?_obj:_obj.style; posObj[_isVertical?(NS?'top':'pixelTop'):(NS?'left':'pixelLeft')] = newPos; if (_txtObj) _txtObj.value = newValue; //load text object if there value = newValue; for (i in c) c[i].validValue(); // walk choices, setting selected if (this.onDrag != null) onDrag(_parent._self+_name, value); if (this.onDrop != null) onDrop(_parent._self+_name, value); _parent.update(true); // update int, but don't judge } } //------------------------------------------------------------------ //Constructs a slider range element. function MM_sldrRnge(theParent, theElement, theName, theExpectedValue, theIsCorrect, theScore) { // properties this.isCorrect = theIsCorrect; this.expectedValue = theExpectedValue; this.score = theScore; this.selected = false; this.disabled = false; this._elem = eval(theParent._self+".e['"+theElement+"']"); this._isChoice = true; // method this.validValue = MM_sldrRgneValidValue; this.setSelected = MM_sldrRgneSetSelected; this.setDisabled = MM_sldrRgneSetDisabled; this.getExpRangeValue = MM_sldrRgneGetExpRangeValue; } //Checks if the current slider value is within the current range. function MM_sldrRgneValidValue() { var myValue,expVal,colonPos,fromStr,fromNum,toStr,toNum,retVal=false; if (!this.disabled) with (this) { fromNum = getExpRangeValue(0); toNum = getExpRangeValue(1); myValue = _elem.value; if (fromNum <= toNum) retVal = (fromNum <= myValue && myValue <= toNum); else retVal = (toNum <= myValue && myValue <= fromNum); selected = retVal; } return retVal } //Averages the range and sets the slider to that average function MM_sldrRgneSetSelected(theSelected) { with (this) { if (theSelected) { fromNum = getExpRangeValue(0); toNum = getExpRangeValue(1); avgNum = fromNum if (fromNum > toNum) avgNum = toNum + (fromNum - toNum)/2; else if (fromNum < toNum) avgNum = fromNum + (toNum - fromNum)/2; if (!this._elem.useFloat) avgNum = Math.round(avgNum); _elem.setValue(avgNum); } else { selected = false; _elem._parent.update(true); } } } function MM_sldrRgneSetDisabled(theDisabled) { with (this) { disabled = theDisabled; if (disabled) selected = false; else validValue(); _elem._parent.update(true); } } //Given colon separated num string, returns one of the numbers. //Pass 0 for first num, 1 for second: "33:46" => 33 or 46 function MM_sldrRgneGetExpRangeValue(numIndex) { var expVal, colonPos, retVal; expVal = this.expectedValue; colonPos = expVal.indexOf(":"); if (colonPos != -1) { //if colon separated, split strings retVal = expVal.substring((numIndex)?colonPos+1:0,(numIndex)?expVal.length:colonPos); } else { //else, theres a single number, no range retVal = expVal; } return (this._elem.useFloat)?parseFloat(retVal):parseInt(retVal); }