diff options
Diffstat (limited to 'src/usr/local/www/javascript/numericupdown/js/numericupdown.js')
-rw-r--r-- | src/usr/local/www/javascript/numericupdown/js/numericupdown.js | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/src/usr/local/www/javascript/numericupdown/js/numericupdown.js b/src/usr/local/www/javascript/numericupdown/js/numericupdown.js new file mode 100644 index 0000000..a6af0d4 --- /dev/null +++ b/src/usr/local/www/javascript/numericupdown/js/numericupdown.js @@ -0,0 +1,287 @@ +// As usual, we keep the generic functions out of the namespace +function addEvent(obj, evType, fn, useCapture){ + if (obj.addEventListener){ + obj.addEventListener(evType, fn, useCapture); + return true; + } else if (obj.attachEvent){ + var r = obj.attachEvent("on"+evType, fn); + return r; + } + return false; +} + +function removeEvent(obj, evType, fn, useCapture){ + if (obj.removeEventListener){ + obj.removeEventListener(evType, fn, useCapture); + return true; + } else if (obj.detachEvent){ + var r = obj.detachEvent("on"+evType, fn); + return r; + } + return false; +} + +if(!String.prototype.trim) String.prototype.trim = function() { return this.replace(/^\s*/,'').replace(/\s*$/, ''); }; + +var incrementalInputController; + +// Encapsulate the Timer and incrementalInput objects +(function() { + +// WEBFX Timer : http://www.webfx.com/ +function Timer(nPauseTime) { + this._pauseTime = typeof nPauseTime == "undefined" ? 1000 : nPauseTime; + this._timer = null; + this._isStarted = false; +} + +Timer.prototype.start = function () { + if (this.isStarted()) + this.stop(); + var oThis = this; + this._timer = window.setTimeout(function () { + if (typeof oThis.ontimer == "function") + oThis.ontimer(); + }, this._pauseTime); + this._isStarted = false; +}; + +Timer.prototype.stop = function () { + if (this._timer != null) + window.clearTimeout(this._timer); + this._isStarted = false; +}; + +Timer.prototype.isStarted = function () { + return this._isStarted; +}; + +Timer.prototype.getPauseTime = function () { + return this._pauseTime; +}; + +Timer.prototype.setPauseTime = function (nPauseTime) { + this._pauseTime = nPauseTime; +}; + +function incrementalInput(inp, range, increment, classInc, classDec) { + if(!inp || !range) return; + + this._inp = inp; + this._buttonInc; + this._buttonDec; + this._value; + this._classInc = classInc; + this._classDec = classDec; + this._minv = Number(range[0]); + this._maxv = Number(range[1]); + this._incBase = Number(increment) || 1; + this._precision = 0; + if(increment.indexOf('.') != -1) { + this._precision = increment.substr(increment.indexOf('.')+1, increment.length); + this._precision = this._precision.length; + } + + this._increment; + this._timerInc = 1000; + this._timer = new Timer(1000); + this._stop = false; + this._key = false; + + this._events = { + + dec: function(e) { + self._increment = -self._incBase; + self.updateValue(); + return false; + }, + inc: function(e) { + self._increment = self._incBase; + self.updateValue(); + return false; + }, + keydec: function(e) { + var kc; + if (!e) var e = window.event; + + if (e.keyCode) kc = e.keyCode; + else if (e.charCode) kc = e.charCode; + + if ( kc != 13 || self._key ) return true; + + self._key = true; + self._increment = -self._incBase; + self._timerInc = 1000; + self.updateValue(); + return false; + }, + keyinc: function(e) { + var kc; + if (!e) var e = window.event; + + if (e.keyCode) kc = e.keyCode; + else if (e.charCode) kc = e.charCode; + + if ( kc != 13 || self._key ) return true; + + self._key = true; + self._increment = self._incBase; + self._timerInc = 1000; + self.updateValue(); + return false; + }, + clearTimer: function(e) { + self._key = false; + self._events.stopTimer(); + }, + stopTimer: function(e) { + self._timer.stop(); + self._timerInc = 1000; + self._timer.setPauseTime(self._timerInc); + }, + onchange: function(e){ + var value = Number(parseFloat(self._inp.value).toFixed(self._precision)); + + if( Number(value % self._incBase).toFixed(self._precision) != self._incBase ) { + value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision); + }; + if(value < self._minv) value = self._minv; + else if(value > self._maxv) value = self._maxv; + self._inp.value = parseFloat(value).toFixed(self._precision); + } + }; + + this.updateValue = function() { + if(self._inp.disabled) { + stopTimer(); + return; + } + + + var value = Number(parseFloat(self._inp.value).toFixed(self._precision)); + var stop = self._timerInc == 0 ? true : false; + + if( Math.abs(Number(value % self._incBase).toFixed(self._precision)) != self._incBase ) { + value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision); + } + + value += Number(parseFloat(self._increment).toFixed(self._precision)); + + if(value < self._minv) { + value = self._minv; + stop = true; + } else if(value > self._maxv) { + value = self._maxv; + stop = true; + } + + self._inp.value = parseFloat(value).toFixed(self._precision); + + if(self._timerInc > 50) { + self._timerInc = 50 + Math.round(((self._timerInc - 50) / 1.8)); + } + + self._timer.setPauseTime(self._timerInc); + if(!stop) self._timer.start(); + }; + + this.construct = function() { + var h = self._inp.offsetHeight; + + self._inp.onchange = self._events.onchange; + + self._buttonInc = document.createElement('button'); + self._buttonDec = document.createElement('button'); + + if(self._classDec) self._buttonDec.className = self._classDec; + if(self._classInc) self._buttonInc.className = self._classInc; + + self._buttonDec.setAttribute('type','button'); + self._buttonInc.setAttribute('type','button'); + + self._buttonDec.appendChild(document.createTextNode('-')); + self._buttonInc.appendChild(document.createTextNode('+')); + + self._buttonDec.onmousedown = self._events.dec; + self._buttonInc.onmousedown = self._events.inc; + + addEvent(self._buttonDec, "keypress", self._events.keydec, true); + addEvent(self._buttonDec, "keyup", self._events.clearTimer, true); + addEvent(self._buttonInc, "keypress", self._events.keyinc, true); + addEvent(self._buttonInc, "keyup", self._events.clearTimer, true); + + self._buttonInc.onmouseout = self._events.stopTimer; + self._buttonDec.onmouseout = self._events.stopTimer; + + addEvent(document, 'mouseup', self._events.stopTimer, false); + + if(self._inp.nextSibling) { + self._inp.parentNode.insertBefore( self._buttonDec, self._inp.nextSibling ); + self._inp.parentNode.insertBefore( self._buttonInc, self._inp.nextSibling ); + } else { + self._inp.parentNode.appendChild( self._buttonInc ); + self._inp.parentNode.appendChild( self._buttonDec ); + }; + }; + + var self = this; + + self._timer.ontimer = function() { self.updateValue(); }; + self.construct(); +} + +incremetalInputController = { + inputCollection: [], + constructor: function() { + + if(!document.getElementById || !document.createElement) return; + + // TODO : cut the regExps down to readable levels - they are hideous at present... + var regExp_1 = /fd_incremental_inp_range_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}/ig; + var regExp_2 = /fd_increment_([0-9]+(f[0-9]+){0,1}){1}/ig; + var regExp_3 = /fd_classname_inc_([\-_0-9a-zA-Z]+){1}/ig; + var regExp_4 = /fd_classname_dec_([\-_0-9a-zA-Z]+){1}/ig; + + var inputCollection = document.getElementsByTagName('input'); + var obj, range, classname, classes, classInc, classDec, increment; + + for(var i = 0, inp; inp = inputCollection[i]; i++) { + if(inp.type == 'text' && inp.className && inp.className.search(regExp_1) != -1) { + classes = inp.className.split(' '); + increment = 1; + range = [0,0]; + classInc = ""; + classDec = ""; + + for(var z = 0, classname; classname = classes[z]; z++) { + if(classname.search(regExp_1) != -1) { + range = classname.trim(); + range = range.replace(/fd_incremental_inp_range_/ig, ''); + range = range.replace(/f/g,'.'); + range = range.split('_'); + } else if(classname.search(regExp_2) != -1) { + increment = classname.trim(); + increment = increment.replace(/fd_increment_/ig, ''); + increment = increment.replace('f','.'); + } else if(classname.search(regExp_3) != -1) { + classInc = classname.trim(); + classInc = classInc.replace(/fd_classname_inc_/ig, ''); + } else if(classname.search(regExp_4) != -1) { + classDec = classname.trim(); + classDec = classDec.replace(/fd_classname_dec_/ig, ''); + } + } + + if (inp.value.length == 0 || isNaN(inp.value) == true) { inp.value = 0; } + + obj = new incrementalInput(inp, range, increment, classInc, classDec); + incremetalInputController.inputCollection.push(obj); + } + } + } +}; + +// Close and call anonymous function +})(); + +addEvent(window, 'load', incremetalInputController.constructor, true);
\ No newline at end of file |