Guest User

Untitled

a guest
May 26th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.67 KB | None | 0 0
  1. (function($) {
  2.  
  3. function tokenize(line) {
  4. line = line.split("");
  5. i = 0;
  6. var state = "out";
  7. var cur_token = []
  8. var tokens = [];
  9. var last_chr = "";
  10.  
  11. while (i < line.length) {
  12. chr = line[i];
  13. if (chr == " " && state == "out") {
  14. tokens.push(cur_token.join(""))
  15. cur_token = []
  16. } else if (chr == '"' && state == "out") {
  17. state = "in";
  18. cur_token.push("'")
  19. } else if (chr == '"' && state == "in" && last_chr != "\\") {
  20. state = "out";
  21. } else if (chr.match(/:/) && state == "out") {
  22. tokens.push(cur_token.join(""))
  23. tokens.push(chr)
  24. cur_token = []
  25. } else {
  26. cur_token.push(chr)
  27. }
  28.  
  29. last_chr = chr;
  30. i++
  31. }
  32. if (cur_token.length > 0) {
  33. tokens.push(cur_token.join(""))
  34. }
  35. return tokens
  36. }
  37.  
  38. function array_split(splitter, arr) {
  39. var ret = []
  40. var cur = []
  41. var word;
  42. for (var i in arr) {
  43. word = arr[i];
  44. if (word == splitter) {
  45. if (cur.length > 0) {
  46. ret.push(cur)
  47. }
  48. cur = []
  49. } else {
  50. cur.push(word)
  51. }
  52. }
  53. if (cur.length > 0) {
  54. ret.push(cur)
  55. }
  56.  
  57. return ret;
  58. }
  59.  
  60. //counting keys in an object
  61. function count(foo) {
  62. var count = 0;
  63. for (var k in foo) {
  64. if (foo.hasOwnProperty(k) && k != "toJSON") {
  65. ++count;
  66. }
  67. }
  68. return count;
  69. }
  70.  
  71. function _s(val, start, end) {
  72. var need_to_join = false;
  73. var ret = []
  74. if (typeof val == "string") {
  75. val = val.split("")
  76. need_to_join = true;
  77. }
  78. if (start >= 0) {
  79. } else {
  80. start = val.length + start
  81. }
  82.  
  83. if (end == null) {
  84. ret = val.slice(start)
  85. } else {
  86. if (end < 0) {
  87. end = val.length + end;
  88. } else {
  89. end = end + start
  90. }
  91. ret = val.slice(start, end)
  92. }
  93.  
  94. if (need_to_join) {
  95. return ret.join("")
  96. } else {
  97. return ret;
  98. }
  99. }
  100.  
  101. function required(value, label, field) {
  102. //console.log(value,label,field)
  103. if (value != "") {
  104. return true;
  105. } else {
  106. var ret = {}
  107. ret[field] = label + " is required";
  108. return ret;
  109. }
  110. }
  111.  
  112. var validators = {
  113. "required" : required,
  114. "filled_in" : required,
  115. a_date: function(x, label, field) {
  116. if (x.match(/[\d]{2}\/[\d]{2}\/[\d]{4}/)) {
  117. return true;
  118. } else {
  119. var ret = {}
  120. ret[field] = label + " must be in the format mm/dd/yyyy";
  121. return ret;
  122. }
  123. }
  124. }
  125.  
  126. $.fn.readable_validator = function(settings) {
  127. var config = {
  128. "alternateValues" : {},
  129. "lables" : {},
  130. "validators" : validators,
  131. "ruleSelector" : "",
  132. "outputSelector" : ""
  133. };
  134. if (settings) $.extend(true, config, settings); //deep extend
  135.  
  136. this.each(function() {
  137. $(this).submit(function(e){
  138.  
  139. var raw = $(this).serializeArray()
  140. var fields = {}
  141. for (var i in raw) {
  142. fields[raw[i]['name']] = raw[i]['value']
  143. }
  144.  
  145. var label_values = config.labels
  146.  
  147. var alter_values = config.alternateValues
  148.  
  149.  
  150. var validators = config.validators
  151.  
  152. var rules = $(config.ruleSelector).html().split("\n");
  153. var rule;
  154. var errors = {};
  155. var error_i = 0;
  156.  
  157. function validate(rule) {
  158. rule = $.trim(rule);
  159. if (_s(rule,-1) == ".") {
  160. rule = _s(rule,0,-1);
  161. }
  162. rule = tokenize(rule)
  163.  
  164.  
  165. function handle_expression(expr) {
  166. var field = expr[0]
  167. if (field == "say") {
  168. error_i = error_i + 1;
  169. var ret = {}
  170. ret[error_i] = _s(expr[1],1)
  171. return ret;
  172. }
  173.  
  174. var operation = _s(expr,1,1)
  175. var next_one = 2;
  176. if (operation == "must") {
  177. next_one = 3
  178. operation = operation + " " + _s(expr,2,1);
  179. }
  180. var value = _s(expr, next_one).join(" ");
  181.  
  182. label = _s(field,1)
  183. field = label_values[label];
  184.  
  185.  
  186. if (_s(value,0,1) == "'") {
  187. operation = operation + " literal";
  188. value = _s(value, 1);
  189. if (field in alter_values) {
  190. value = alter_values[field](value);
  191. }
  192. }
  193.  
  194. if (operation == "must be") {
  195. operation = "is";
  196. }
  197. real_value = fields[field];
  198.  
  199. if (operation == "is literal") {
  200. var ret = real_value == value;
  201. return ret
  202. } else if (operation == "isn't literal") {
  203. var ret = real_value != value;
  204. return ret;
  205. } else if (operation == "is") {
  206. value = value.replace(/ /g,"_");
  207. if (value in validators) {
  208. return validators[value](real_value, label, field);
  209. } else {
  210. return false;
  211. }
  212. } else if (operation == "isn't") {
  213. value = value.replace(/ /g,"_");
  214. if (value in validators) {
  215. return validators[value](real_value, label, field);
  216. } else {
  217. return false;
  218. }
  219. }
  220. }
  221.  
  222. function handle_if() {
  223. rule = rule.slice(1)
  224. rule = array_split("then", rule);
  225. var left = rule[0];
  226. var right = rule[1];
  227. left = array_split("and", left);
  228.  
  229. right = array_split("and", right);
  230.  
  231. for (var i in left) {
  232.  
  233. var ret = true;
  234. var expr = left[i]
  235. if (expr == "true") {
  236. break;
  237. }
  238. var handled_expression = handle_expression(expr);
  239. if (handled_expression !== true) {
  240. handled_expression = false;
  241. }
  242. ret = ret && handled_expression
  243. if (ret == false) {
  244. break;
  245. }
  246. }
  247. if (ret == true) {
  248. for (var i in right) {
  249. var expr = right[i];
  250. var ret = handle_expression(expr);
  251.  
  252. if (ret != true) {
  253. for (var i in ret) {
  254. errors[i] = ret[i]
  255. }
  256.  
  257. }
  258. }
  259.  
  260.  
  261. } else {
  262. //alert('good')
  263. }
  264.  
  265. }
  266. if (rule[0] == "If") {
  267. handle_if();
  268.  
  269. } else {
  270. var first = rule[0];
  271. if (!first) {
  272. return;
  273. }
  274. if (_s(first,0,2) == "//") {
  275. return
  276. }
  277.  
  278. rule = array_split("if", rule)
  279. if (rule.length == 1) {
  280. rule = rule[0];
  281. rule.splice(0,0, "if", "true", "then");
  282. handle_if();
  283. } else { // "Packet Sent Date" is required if "something" is a date
  284. new_rule = ["If"]
  285. for (var i in rule[1]) {
  286. new_rule.push(rule[1][i])
  287. }
  288. new_rule.push('then')
  289. for (var i in rule[0]) {
  290. new_rule.push(rule[0][i])
  291. }
  292.  
  293. rule = new_rule;
  294. handle_if();
  295. }
  296.  
  297.  
  298. }
  299. }
  300.  
  301. for (var i in rules) {
  302. rule = rules[i]
  303. validate(rule)
  304. }
  305. if (count(errors) > 0) {
  306. $(config.outputSelector).empty()
  307. for (var i in errors) {
  308. if (i == "toJSON") {
  309. continue;
  310. }
  311. $(config.outputSelector).append("<di"+"v>"+errors[i]+"<"+"/d"+"iv>")
  312. window.scroll(0,0)
  313. }
  314. e.preventDefault();
  315. } else {
  316.  
  317. }
  318. })
  319. });
  320. return this;
  321.  
  322. };
  323.  
  324. })(jQuery);
Add Comment
Please, Sign In to add comment