$.fn.resetUnitVal = function(){ this.each(function(){ var n = $(this).data("px") $(this).unitVal(n) }); } $.fn.unitVal = function(n){ var s if (typeof n === "undefined") { s = $(this).val() n = stringToMeasurement( s ) if (! n || isNaN(n)) { n = $(this).data("px") } } s = measurementToString( n ) $(this).val( s ).data("px", n) return n } function measurementToString( n ) { var s, ft, inch switch (app.units) { case 'm': s = round(n/36 * 0.3048 * 100) / 100 + " m" break case 'ft': ft = floor(n / 36) inch = abs(round((n % 36) / 3)) s = ft + "'" if (inch > 0) { s += " " + inch + '"' } break case 'px': default: s = round(n) + " px" break } return s } function stringToMeasurement( s ) { var ft, inch, ft_in, type if (! s.match(/[0-9]/)) { return NaN } if (s.indexOf("'") !== -1 || s.indexOf('"') !== -1 || s.indexOf('ft') !== -1) { ft_in = s.match(/[0-9.]+/g) if (ft_in.length >= 2) { ft = parseFloat( ft_in[0] ) inch = parseFloat( ft_in[1] ) } else if (ft_in.length == 1) { if (s.indexOf('"') !== -1) { ft = 0 inch = parseFloat( ft_in[0] ) } else { ft = parseFloat( ft_in[0] ) inch = 0 } } else { ft = inch = 0 } n = ft * 36 + inch * 3 } else if (s.indexOf("m") !== -1) { n = parseFloat(s.match(/[0-9.]+/)) * 36 / 0.3048 } else if (s.indexOf("px") !== -1) { n = parseFloat(s.match(/[0-9.]+/)) } else { n = abs( stringToMeasurement( s + app.units ) ) } if (s.indexOf('-') !== -1) { n *= -1 } return n }