jquery.dragval-1.0.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /**
  2. * plugin name: jQuery Dragval
  3. * varsion: 1.0
  4. * Alpha
  5. * license: GNU GENERAL PUBLIC LICENSE v3
  6. *
  7. * September 21, 2010
  8. *
  9. * Copyright (c) 2010 Kamil Szalewski (http://szalewski.pl, http://pimago.pl)
  10. *
  11. * jQuery Dragval is free software: you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation, either version 3 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * jQuery Dragval is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
  23. *
  24. **/
  25. (function($) {
  26. jQuery.fn.dragval = function(options) {
  27. set = jQuery.extend({
  28. out: ".Output", // klasa inputa wyjściowego
  29. actMin: ".ActMin", // input przetrzymujący aktualnie najmniejszą wartość
  30. actMax: ".ActMax", // input przetrzymujący aktualnie największą wartość
  31. loop: ".Loop", // input do sprawdzania czy pętla true, czy false
  32. dragloop: ".DragLoop", // input do sprawdzania czy odpalona zostala juz akcja przesuwania miarki po dojechaniu do konca
  33. rightloop: ".RightLoop", // sprawdza czy petla po wyjechaniu jest w prawo
  34. leftloop: ".LeftLoop", // jw w lewo
  35. mouseout: ".MouseOut", // input sledzacy czy kursor jest na miarce
  36. measure: ".Measure", // klasa wartości miarki
  37. indicator: ".Indicator", // klasa wskaźnika
  38. track: ".Track", // klasa trasy wskaźnika
  39. label: ".Label", // klasa jednej przedziałki
  40. labels: ".Labels", // klasa wszystkich przedziałek
  41. leftBtn: ".LeftBtn", // lewa strzałka
  42. rightBtn: ".RightBtn", // prawa strzałka
  43. loopTime: 60, // czas kolejnego przejścia miarki przy przytrzymywaniu strzałki (ms)
  44. clickTime: 200, // czas po jakim zaczyna się pętla a kończy pojedyńcze kliknięcie (ms)
  45. step: 10000, // wartość jednego kroku
  46. min: 10000, // minimalna wartość
  47. max: 2000000, // maksymalna wartość
  48. startValue: 0, // startowa wartosc na pasku
  49. indicStep: 51.7, // długość jednego kroku (px)
  50. iniPosition: 17 // odległość od początku trasy przy starcie (px)
  51. }, options);
  52. this.each(function() {
  53. var obj = $(this);
  54. obj.prepend('<div class="Container">'
  55. +'<div class="Track">'
  56. +'<div class="Indicator"></div>'
  57. +'<div class="LeftBtn"></div>'
  58. +'<div class="Labels">'
  59. +'<div class="Label LabelFirst" id="lab-1"></div>'
  60. +'<div class="Label" id="lab-2"></div>'
  61. +'<div class="Label" id="lab-3"></div>'
  62. +'<div class="Label" id="lab-4"></div>'
  63. +'<div class="Label" id="lab-5"></div>'
  64. +'<div class="Label" id="lab-6"></div>'
  65. +'<div class="Label" id="lab-7"></div>'
  66. +'<div class="Label" id="lab-8"></div>'
  67. +'<div class="Label" id="lab-9"></div>'
  68. +'<div class="Label LabelLast" id="lab-10"></div>'
  69. +'</div>'
  70. +'<div class="RightBtn"></div>'
  71. +'</div>'
  72. +'<div class="Measure"></div>'
  73. +'</div>'
  74. +'<input type="hidden" name="" value="" class="ActMin" />'
  75. +'<input type="hidden" name="" value="" class="ActMax" />'
  76. +'<input type="hidden" name="" value="0" class="Loop" />'
  77. +'<input type="hidden" name="" value="0" class="DragLoop" />'
  78. +'<input type="hidden" name="" value="0" class="MouseOut" />'
  79. +'<input type="hidden" name="" value="0" class="LeftLoop" />'
  80. +'<input type="hidden" name="" value="0" class="RightLoop" />');
  81. var indicator = set.indicator;
  82. var loopTime = Number(set.loopTime);
  83. var clickTime = Number(set.clickTime);
  84. var step = Number(set.step);
  85. var min = Number(set.min);
  86. var max = Number(set.max);
  87. var startValue = Number(set.startValue);
  88. var indicStep = Number(set.indicStep);
  89. var iniPosition = Number(set.iniPosition);
  90. if(startValue > 0) {
  91. $(set.out, obj).attr("value", set.startValue);
  92. $(set.actMin, obj).attr("value", set.startValue); // aktualnie najmniejsza wartość
  93. $(set.actMax, obj).attr("value", set.startValue+(9*set.step)); // aktualnie największa wartość
  94. toValue( startValue );
  95. } else {
  96. // przypisujemy polom zdefinoiowane wartości...
  97. $(set.out, obj).attr("value", set.min);
  98. $(set.actMin, obj).attr("value", set.min); // aktualnie najmniejsza wartość
  99. $(set.actMax, obj).attr("value", set.min+(9*set.step)); // aktualnie największa wartość
  100. //... i generujemy miarkę
  101. var x = set.min;
  102. $(set.measure, obj).html(" ");
  103. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  104. while (x <= set.min+(9*set.step)) {
  105. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  106. x = x+set.step;
  107. }
  108. }
  109. //
  110. // zaczynamy zabawę ;-)
  111. // AKCJE
  112. // obsługa drag
  113. var track = $(set.track, obj);
  114. $(indicator, obj).draggable({
  115. axis: 'x',
  116. containment: track,
  117. grid: [indicStep, indicStep],
  118. stop: function(event, ui) {
  119. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  120. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  121. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  122. $(set.out, obj).attr("value", Number((posNumber-1)*step)+actMin);
  123. $(set.loop, obj).attr("value", 0);
  124. $(set.dragloop, obj).attr("value", 0);
  125. $(set.mouseout, obj).attr("value", 0);
  126. $(set.rightloop, obj).attr("value", 0);
  127. $(set.leftloop, obj).attr("value", 0);
  128. },
  129. drag: function(event, ui) {
  130. // odpowiada za przesuwanie po wyjechaniu w lewo lub prawo
  131. if($(set.dragloop, obj).attr("value")=='0') {
  132. if(Number($(indicator, obj).css("left").split("px")[0])<=17 && $(set.mouseout, obj).attr("value")=='1') {
  133. $(set.loop, obj).attr("value", 1);
  134. $(set.dragloop, obj).attr("value", 1);
  135. $(set.leftloop, obj).attr("value", 1);
  136. moveLeft();
  137. }
  138. if(Number($(indicator, obj).css("left").split("px")[0])>=481 && $(set.mouseout, obj).attr("value")=='1') {
  139. $(set.loop, obj).attr("value", 1);
  140. $(set.dragloop, obj).attr("value", 1);
  141. $(set.rightloop, obj).attr("value", 1);
  142. moveRight();
  143. }
  144. } else if(Number($(indicator, obj).css("left").split("px")[0]) < 482 && $(set.rightloop, obj).attr("value")=='1') {
  145. $(set.loop, obj).attr("value", 0);
  146. $(set.dragloop, obj).attr("value", 0);
  147. $(set.rightloop, obj).attr("value", 0);
  148. } else if(Number($(indicator, obj).css("left").split("px")[0]) > 17 && $(set.leftloop, obj).attr("value")=='1') {
  149. $(set.loop, obj).attr("value", 0);
  150. $(set.dragloop, obj).attr("value", 0);
  151. $(set.leftloop, obj).attr("value", 0);
  152. }
  153. //$("#Debug").html(Math.round(Number($(indicator, obj).css("left").split("px")[0]))-Math.round(iniPosition));
  154. if(Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ) >= 1 && Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ) <= 10) {
  155. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  156. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  157. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  158. $(set.out, obj).attr("value", Number((posNumber-1)*step)+actMin);
  159. }
  160. }
  161. });
  162. // po kliknięciu w przedziałke
  163. $(set.label, obj).click(function() {
  164. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  165. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  166. var posNumber = $(this).attr("id").split("-")[1]; // number pozycji na linijce
  167. var distance = Number(posNumber * indicStep)-indicStep; // długość pomiędzy początkiem a labelem na którego kliknięto
  168. $(set.out, obj).attr("value", Number((posNumber-1)*step)+actMin);
  169. $(set.indicator, obj).css("left", distance+iniPosition+"px");
  170. });
  171. // lewy przycisk
  172. $(set.leftBtn, obj).mousedown(function() {
  173. $(set.loop, obj).attr("value", 1);
  174. moveLeftWarun( 1 );
  175. }).mouseup(function() {
  176. $(set.loop, obj).attr("value", 0);
  177. $(set.mouseout, obj).attr("value", 0);
  178. });
  179. // prawy przycisk
  180. $(set.rightBtn, obj).mousedown(function() {
  181. $(set.loop, obj).attr("value", 1);
  182. moveRightWarun( 1 );
  183. }).mouseup(function() {
  184. $(set.loop, obj).attr("value", 0);
  185. $(set.mouseout, obj).attr("value", 0);
  186. });
  187. // wyjechanie poza miarkę z przytrzymanym przyciskiem
  188. $(set.labels, obj).mouseleave(function() {
  189. if($(indicator, obj).attr("class")=="Indicator ui-draggable ui-draggable-dragging") {
  190. $(set.loop, obj).attr("value", 1);
  191. $(set.mouseout, obj).attr("value", 1);
  192. }
  193. }).mouseover(function() {
  194. $(set.loop, obj).attr("value", 0);
  195. $(set.mouseout, obj).attr("value", 0);
  196. });
  197. $(indicator, obj).mouseleave(function() {
  198. if($(indicator, obj).attr("class")=="Indicator ui-draggable ui-draggable-dragging") {
  199. $(set.loop, obj).attr("value", 1);
  200. $(set.mouseout, obj).attr("value", 1);
  201. }
  202. });
  203. // puszczenie indicatora
  204. $(indicator, obj).mouseup(function() {
  205. $(set.loop, obj).attr("value", 0);
  206. $(set.mouseout, obj).attr("value", 0);
  207. });
  208. // obsługa wpisywania wartości do inputa
  209. $(set.out, obj).focusout(function() {
  210. var newValue = Number((Math.round(Number($(set.out, obj).attr("value"))/step))*step); // nowa wartość po obliczeniu i zaokrągleniu
  211. if(integer_validate(newValue)) {
  212. toValue( newValue );
  213. } else {
  214. toValue( min );
  215. $(set.out, obj).attr("value", min);
  216. }
  217. });
  218. // FUNKCJE
  219. function toValue( newValue ) { // funckja przesuwa indicator do wybranej wartosci
  220. if(newValue >= min && newValue <= max) {
  221. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  222. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  223. // jeżeli nowa wartość jest równa max
  224. if(newValue==max) {
  225. $(set.actMin, obj).attr("value", newValue-(9*step));
  226. $(set.actMax, obj).attr("value", newValue);
  227. //$(set.out, obj).attr("value", newValue);
  228. $(indicator, obj).css("left", iniPosition+(9*indicStep)+"px"); // przesuwamy indicator'a
  229. //... i generujemy miarkę
  230. var x = newValue-(9*step);
  231. $(set.measure, obj).html(" ");
  232. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  233. while (x <= newValue) {
  234. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  235. x = x+step;
  236. }
  237. // jeżeli nowa wartość jest w obrębie aktualniej miarki
  238. } else if(newValue > actMin && newValue < actMax) {
  239. var stepsTo = (10-((actMax-newValue)/step))-1; // obliczamy ilość kroków na miarce do osiągnięcia nowej wartości
  240. //$(set.out, obj).attr("value", newValue);
  241. $(indicator, obj).css("left", (stepsTo*indicStep)+17+"px"); // przesuwamy indicator'a
  242. } else { // jeżeli nie
  243. $(set.actMin, obj).attr("value", newValue);
  244. $(set.actMax, obj).attr("value", newValue+(9*step));
  245. //$(set.out, obj).attr("value", newValue);
  246. $(indicator, obj).css("left", "17px"); // przesuwamy indicator'a
  247. //... i generujemy miarkę
  248. var x = newValue;
  249. $(set.measure, obj).html(" ");
  250. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  251. while (x <= (newValue+(9*step))) {
  252. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  253. x = x+step;
  254. }
  255. }
  256. } else if(newValue > max) {
  257. toValue( max );
  258. $(set.out, obj).attr("value", max);
  259. } else if(newValue < min) {
  260. toValue( min );
  261. $(set.out, obj).attr("value", min);
  262. }
  263. }
  264. function integer_validate(src) {
  265. var regex = /^[\-]{0,1}[0-9]{1,8}$/;
  266. return regex.test(src);
  267. }
  268. function number_format(l,r){w='';while(a=~~(l/1e3)){w=r+((b=l%1e3)>9?(b>99?'':'0'):'00')+b+w;l=a}return l+w}
  269. // funkcja bez warunku sprawdzającego czy ma zacząć zapętlanie W LEWO
  270. function moveLeft() {
  271. var actValue = Number($(set.out, obj).attr("value")); // aktualna wartość inputa
  272. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  273. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  274. // jeżeli aktualny max jest większy od maxa to jedziemy ze skryptem...
  275. if(actMin>min) {
  276. $(set.out, obj).attr("value", actValue-step);
  277. $(set.actMin, obj).attr("value", actMin-step);
  278. $(set.actMax, obj).attr("value", actMax-step);
  279. var x = Number($(set.actMin, obj).attr("value"));
  280. $(set.measure, obj).html(""); // czyścimy diva z miarką
  281. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  282. while (x <= Number($(set.actMax, obj).attr("value"))) {
  283. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  284. x = x+step;
  285. }
  286. } else {
  287. // ...a jeżeli nie to przesuwamy Indicator'a...
  288. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  289. var distance = Number(posNumber * indicStep)-indicStep; // długość pomiędzy początkiem a labelem na którego kliknięto
  290. // ...no chyba, że się nie na :)
  291. if(posNumber>1) {
  292. $(set.out, obj).attr("value", (Number((posNumber-1)*step)+actMin)-step);
  293. $(indicator, obj).css("left", (distance+iniPosition)-indicStep+"px");
  294. }
  295. }
  296. if($(set.loop, obj).attr("value")>0) {
  297. setTimeout(moveLeft, loopTime);
  298. }
  299. }
  300. // funckja z warunkiem sprawdzającym czy ma zacząć zapętlanie W LEWO
  301. function moveLeftWarun( w ) {
  302. var actValue = Number($(set.out, obj).attr("value")); // aktualna wartość inputa
  303. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  304. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  305. // jeżeli aktualny max jest większy od maxa to jedziemy ze skryptem...
  306. if(actMin>min) {
  307. $(set.out, obj).attr("value", actValue-step);
  308. $(set.actMin, obj).attr("value", actMin-step);
  309. $(set.actMax, obj).attr("value", actMax-step);
  310. var x = Number($(set.actMin, obj).attr("value"));
  311. $(set.measure, obj).html(""); // czyścimy diva z miarką
  312. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  313. while (x <= Number($(set.actMax, obj).attr("value"))) {
  314. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  315. x = x+step;
  316. }
  317. } else {
  318. // ...a jeżeli nie to przesuwamy Indicator'a...
  319. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  320. var distance = Number(posNumber * indicStep)-indicStep; // długość pomiędzy początkiem a labelem na którego kliknięto
  321. // ...no chyba, że się nie na :)
  322. if(posNumber>1) {
  323. $(set.out, obj).attr("value", (Number((posNumber-1)*step)+actMin)-step);
  324. $(indicator, obj).css("left", (distance+iniPosition)-indicStep+"px");
  325. }
  326. }
  327. if(w>0) {
  328. setTimeout(checkLoopLeft, clickTime);
  329. } else {
  330. if($(set.loop, obj).attr("value")>0) {
  331. setTimeout(moveLeft, loopTime);
  332. }
  333. }
  334. }
  335. // funkcja sprawdza czy odpalić lewą pętlę
  336. function checkLoopLeft() {
  337. if($(set.loop, obj).attr("value")>0) {
  338. moveLeft();
  339. }
  340. }
  341. // funkcja bez warunku sprawdzającego czy ma zacząć zapętlanie W LEWO
  342. function moveRight() {
  343. var actValue = Number($(set.out, obj).attr("value")); // aktualna wartość inputa
  344. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  345. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  346. // jeżeli aktualny max jest większy od maxa to jedziemy ze skryptem...
  347. if(actMax<max) {
  348. $(set.out, obj).attr("value", actValue+step);
  349. $(set.actMin, obj).attr("value", actMin+step);
  350. $(set.actMax, obj).attr("value", actMax+step);
  351. var x = Number($(set.actMin, obj).attr("value"));
  352. $(set.measure, obj).html(""); // czyścimy diva z miarką
  353. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  354. while (x <= Number($(set.actMax, obj).attr("value"))) {
  355. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  356. x = x+step;
  357. }
  358. } else {
  359. // ...a jeżeli nie to przesuwamy Indicator'a...
  360. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  361. var distance = Number(posNumber * indicStep)-indicStep; // długość pomiędzy początkiem a labelem na którego kliknięto
  362. // ...no chyba, że się nie na :)
  363. if(posNumber<10) {
  364. $(set.out, obj).attr("value", (Number((posNumber-1)*step)+actMin)+step);
  365. $(indicator, obj).css("left", (distance+iniPosition)+indicStep+"px");
  366. }
  367. }
  368. if($(set.loop, obj).attr("value")>0) {
  369. setTimeout(moveRight, loopTime);
  370. }
  371. }
  372. // funckja z warunkiem sprawdzającym czy ma zacząć zapętlanie W LEWO
  373. function moveRightWarun( w ) {
  374. var actValue = Number($(set.out, obj).attr("value")); // aktualna wartość inputa
  375. var actMin = Number($(set.actMin, obj).attr("value")); // aktualnie najmniejsza wartość
  376. var actMax = Number($(set.actMax, obj).attr("value")); // aktualnie największa wartość
  377. // jeżeli aktualny max jest większy od maxa to jedziemy ze skryptem...
  378. if(actMax<max) {
  379. $(set.out, obj).attr("value", actValue+step);
  380. $(set.actMin, obj).attr("value", actMin+step);
  381. $(set.actMax, obj).attr("value", actMax+step);
  382. var x = Number($(set.actMin, obj).attr("value"));
  383. $(set.measure, obj).html(""); // czyścimy diva z miarką
  384. // ta pętla wypełnia diva z miarką od wartości najmniejszej do największej
  385. while (x <= Number($(set.actMax, obj).attr("value"))) {
  386. $(set.measure, obj).append("<span class=\"Value\">"+number_format(x," ")+"</span>");
  387. x = x+step;
  388. }
  389. } else {
  390. // ...a jeżeli nie to przesuwamy Indicator'a...
  391. var posNumber = Math.round( ( ( Number($(indicator, obj).css("left").split("px")[0]) - iniPosition ) / indicStep ) + 1 ); // numer pozycji na linijce
  392. var distance = Number(posNumber * indicStep)-indicStep; // długość pomiędzy początkiem a labelem na którego kliknięto
  393. // ...no chyba, że się nie na :)
  394. if(posNumber<10) {
  395. $(set.out, obj).attr("value", (Number((posNumber-1)*step)+actMin)+step);
  396. $(indicator, obj).css("left", (distance+iniPosition)+indicStep+"px");
  397. }
  398. }
  399. if(w>0) {
  400. setTimeout(checkLoopRight, clickTime);
  401. } else {
  402. if($(set.loop, obj).attr("value")>0) {
  403. setTimeout(moveRight, loopTime);
  404. }
  405. }
  406. }
  407. // funkcja sprawdza czy odpalić prawą pętlę
  408. function checkLoopRight() {
  409. if($(set.loop, obj).attr("value")>0) {
  410. moveRight();
  411. }
  412. }
  413. });
  414. return this;
  415. };
  416. })(jQuery);