PageSourceSearch

https://wearechange.org/wp-content/cache/wpfc-minified/ehtmb3cz/f8xj4.js

js wearechange.org collected 2026-10-03 21:38:43 UTC 69,769 bytes, 2,300 lines download raw bytes

1var qq=qq||{};
2qq.extend=function(first, second){
3for (var prop in second){
4first[prop]=second[prop];
5}};
6qq.indexOf=function(arr, elt, from){
7if(arr.indexOf)
8return arr.indexOf(elt, from);
9from=from||0;
10var len=arr.length;
11if(from < 0)
12from +=len;
13for (; from < len; from++){
14if(from in arr&&arr[from]===elt){
15return from;
16}}
17return -1;
18};
19qq.getUniqueId=(function(){
20var id=0;
21return function(){
22return id++;
23};})();
24qq.attach=function(element, type, fn){
25if(element.addEventListener){
26element.addEventListener(type, fn, false);
27}else if(element.attachEvent){
28element.attachEvent('on' + type, fn);
29}};
30qq.detach=function(element, type, fn){
31if(element.removeEventListener){
32element.removeEventListener(type, fn, false);
33}else if(element.attachEvent){
34element.detachEvent('on' + type, fn);
35}};
36qq.preventDefault=function(e){
37if(e.preventDefault){
38e.preventDefault();
39}else{
40e.returnValue=false;
41}};
42qq.insertBefore=function(a, b){
43b.parentNode.insertBefore(a, b);
44};
45qq.remove=function(element){
46element.parentNode.removeChild(element);
47};
48qq.contains=function(parent, descendant){
49if(parent==descendant)
50return true;
51if(parent.contains){
52return parent.contains(descendant);
53}else{
54return !!(descendant.compareDocumentPosition(parent) & 8);
55}};
56qq.toElement=(function(){
57var div=document.createElement('div');
58return function(html){
59div.innerHTML=html;
60var element=div.firstChild;
61div.removeChild(element);
62return element;
63};})();
64qq.css=function(element, styles){
65if(styles.opacity!=null){
66if(typeof element.style.opacity!='string'&&typeof (element.filters)!='undefined'){
67styles.filter='alpha(opacity=' + Math.round(100 * styles.opacity) + ')';
68}}
69qq.extend(element.style, styles);
70};
71qq.hasClass=function(element, name){
72var re=new RegExp('(^|)' + name + '(|$)');
73return re.test(element.className);
74};
75qq.addClass=function(element, name){
76if(!qq.hasClass(element, name)){
77element.className +=' ' + name;
78}};
79qq.removeClass=function(element, name){
80var re=new RegExp('(^|)' + name + '(|$)');
81element.className=element.className.replace(re, ' ').replace(/^\s+|\s+$/g, "");
82};
83qq.setText=function(element, text){
84element.innerText=text;
85element.textContent=text;
86};
87qq.children=function(element){
88var children=[],
89child=element.firstChild;
90while (child){
91if(child.nodeType==1){
92children.push(child);
93}
94child=child.nextSibling;
95}
96return children;
97};
98qq.getByClass=function(element, className){
99if(element.querySelectorAll){
100return element.querySelectorAll('.' + className);
101}
102var result=[];
103var candidates=element.getElementsByTagName("*");
104var len=candidates.length;
105for (var i=0; i < len; i++){
106if(qq.hasClass(candidates[i], className)){
107result.push(candidates[i]);
108}}
109return result;
110};
111qq.obj2url=function(obj, temp, prefixDone){
112var uristrings=[],
113prefix='&',
114add=function(nextObj, i){
115var nextTemp=temp
116? (/\[\]$/.test(temp))
117? temp
118: temp + '[' + i + ']'
119: i;
120if((nextTemp!='undefined')&&(i!='undefined')){
121uristrings.push((typeof nextObj==='object')
122? qq.obj2url(nextObj, nextTemp, true)
123: (Object.prototype.toString.call(nextObj)==='[object Function]')
124? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj())
125: encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj)
126);
127}};
128if(!prefixDone&&temp){
129prefix=(/\?/.test(temp)) ? (/\?$/.test(temp)) ? '':'&':'?';
130uristrings.push(temp);
131uristrings.push(qq.obj2url(obj));
132}else if((Object.prototype.toString.call(obj)==='[object Array]')&&(typeof obj!='undefined')){
133for (var i=0, len=obj.length; i < len; ++i){
134add(obj[i], i);
135}}else if((typeof obj!='undefined')&&(obj!==null)&&(typeof obj==="object")){
136for (var i in obj){
137add(obj[i], i);
138}}else{
139uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj));
140}
141return uristrings.join(prefix)
142.replace(/^&/, '')
143.replace(/%20/g, '+');
144};
145var qq=qq||{};
146qq.FileUploaderBasic=function(o){
147this._options={
148debug: false,
149action: '/server/upload',
150params: {},
151button: null,
152multiple: true,
153maxConnections: 3,
154allowedExtensions: [],
155sizeLimit: 0,
156minSizeLimit: 0,
157onSubmit: function(id, fileName){
158},
159onProgress: function(id, fileName, loaded, total){
160},
161onComplete: function(id, fileName, responseJSON){
162},
163onCancel: function(id, fileName){
164},
165messages: {
166typeError: "{file}
166 has invalid extension. Only {extensions} are allowed.",
167sizeError: "{file} is too large, maximum file size is {sizeLimit}.",
168minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.",
169emptyError: "{file} is empty, please select files again without it.",
170onLeave: "The files are being uploaded, if you leave now the upload will be cancelled."
171},
172showMessage: function(message){
173alert(message);
174}};
175qq.extend(this._options, o);
176this._filesInProgress=0;
177this._handler=this._createUploadHandler();
178if(this._options.button){
179this._button=this._createUploadButton(this._options.button);
180}
181this._preventLeaveInProgress();
182};
183qq.FileUploaderBasic.prototype={
184setParams: function(params){
185this._options.params=params;
186},
187getInProgress: function(){
188return this._filesInProgress;
189},
190_createUploadButton: function(element){
191var self=this;
192return new qq.UploadButton({
193element: element,
194multiple: this._options.multiple&&qq.UploadHandlerXhr.isSupported(),
195onChange: function(input){
196self._onInputChange(input);
197}});
198},
199_createUploadHandler: function(){
200var self=this,
201handlerClass;
202if(qq.UploadHandlerXhr.isSupported()){
203handlerClass='UploadHandlerXhr';
204}else{
205handlerClass='UploadHandlerForm';
206}
207var handler=new qq[handlerClass]({
208debug: this._options.debug,
209action: this._options.action,
210maxConnections: this._options.maxConnections,
211onProgress: function(id, fileName, loaded, total){
212self._onProgress(id, fileName, loaded, total);
213self._options.onProgress(id, fileName, loaded, total);
214},
215onComplete: function(id, fileName, result){
216self._onComplete(id, fileName, result);
217self._options.onComplete(id, fileName, result);
218},
219onCancel: function(id, fileName){
220self._onCancel(id, fileName);
221self._options.onCancel(id, fileName);
222}});
223return handler;
224},
225_preventLeaveInProgress: function(){
226var self=this;
227qq.attach(window, 'beforeunload', function(e){
228if(!self._filesInProgress){
229return;
230}
231var e=e||window.event;
232e.returnValue=self._options.messages.onLeave;
233return self._options.messages.onLeave;
234});
235},
236_onSubmit: function(id, fileName){
237this._filesInProgress++;
238},
239_onProgress: function(id, fileName, loaded, total){
240},
241_onComplete: function(id, fileName, result){
242this._filesInProgress--;
243if(result.error){
244this._options.showMessage(result.error);
245}},
246_onCancel: function(id, fileName){
247this._filesInProgress--;
248},
249_onInputChange: function(input){
250if(this._handler instanceof qq.UploadHandlerXhr){
251this._uploadFileList(input.files);
252}else{
253if(this._validateFile(input)){
254this._uploadFile(input);
255}}
256this._button.reset();
257},
258_uploadFileList: function(files){
259for (var i=0; i < files.length; i++){
260if(!this._validateFile(files[i])){
261return;
262}}
263for (var i=0; i < files.length; i++){
264this._uploadFile(files[i]);
265}},
266_uploadFile: function(fileContainer){
267var id=this._handler.add(fileContainer);
268var fileName=this._handler.getName(id);
269if(this._options.onSubmit(id, fileName)!==false){
270this._onSubmit(id, fileName);
271this._handler.upload(id, this._options.params);
272}},
273_validateFile: function(file){
274var name, size;
275if(file.value){
276name=file.value.replace(/.*(\/|\\)/, "");
277}else{
278name=file.fileName!=null ? file.fileName:file.name;
279size=file.fileSize!=null ? file.fileSize:file.size;
280}
281if(!this._isAllowedExtension(name)){
282this._error('typeError', name);
283return false;
284}else if(size===0){
285this._error('emptyError', name);
286return false;
287}else if(size&&this._options.sizeLimit&&size > this._options.sizeLimit){
288this._error('sizeError', name);
289return false;
290}else if(size&&size < this._options.minSizeLimit){
291this._error('minSizeError', name);
292return false;
293}
294return true;
295},
296_error: function(code, fileName){
297var message=this._options.messages[code];
298function r(name, replacement){
299message=message.replace(name, replacement);
300}
301r('{file}', this._formatFileName(fileName));
302r('{extensions}', this._options.allowedExtensions.join(', '));
303r('{sizeLimit}', this._formatSize(this._options.sizeLimit));
304r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit));
305this._options.showMessage(message);
306},
307_formatFileName: function(name){
308if(name.length > 33){
309name=name.slice(0, 19) + '...' + name.slice(-13);
310}
311return name;
312},
313_isAllowedExtension: function(fileName){
314var ext=(-1!==fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase():'';
315var allowed=this._options.allowedExtensions;
316if(!allowed.length){
317return true;
318}
319for (var i=0; i < allowed.length; i++){
320if(allowed[i].toLowerCase()==ext){
321return true;
322}}
323return false;
324},
325_formatSize: function(bytes){
326var i=-1;
327do {
328bytes=bytes / 1024;
329i++;
330} while (bytes > 99);
331return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
332}};
333qq.FileUploader=function(o){
334qq.FileUploaderBasic.apply(this, arguments);
335qq.extend(this._options, {
336element: null,
337listElement: null,
338template: '<div class="qq-uploader">' +
339'<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>' +
340'<div class="qq-upload-button"><span>' + o.button_label + '</span></div>' +
341'<ul class="qq-upload-list"></ul>' +
342'</div>',
343fileTemplate: '<li style="display: none;">' +
344'<span class="qq-upload-file"></span>' +
345'<span class="qq-upload-spinner"></span>' +
346'<span class="qq-upload-size"></span>' +
347'<a class="qq-upload-cancel" href="#">Cancel</a>' +
348'<span class="qq-upload-failed-text">Failed</span>' +
349'</li>',
350classes: {
351button: 'qq-upload-button',
352drop: 'qq-upload-drop-area',
353dropActive: 'qq-upload-drop-area-active',
354list: 'qq-upload-list',
355file: 'qq-upload-file',
356spinner: 'qq-upload-spinner',
357size: 'qq-upload-size',
358cancel: 'qq-upload-cancel',
359success: 'qq-upload-success',
360fail: 'qq-upload-fail'
361}});
362qq.extend(this._options, o);
363this._element=this._options.element;
364this._element.innerHTML=this._options.template;
365this._listElement=this._options.listElement||this._find(this._element, 'list');
366this._classes=this._options.classes;
367this._button=this._createUploadButton(this._find(this._element, 'button'));
368this._bindCancelEvent();
369this._setupDragDrop();
370};
371qq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype);
372qq.extend(qq.FileUploader.prototype, {
373_find: function(parent, type){
374var element=qq.getByClass(parent, this._options.classes[type])[0];
375if(!element){
376throw new Error('element not found ' + type);
377}
378return element;
379},
380_setupDragDrop: function(){
381var self=this,
382dropArea=this._find(this._element, 'drop');
383var dz=new qq.UploadDropZone({
384element: dropArea,
385onEnter: function(e){
386qq.addClass(dropArea, self._classes.dropActive);
387e.stopPropagation();
388},
389onLeave: function(e){
390e.stopPropagation();
391},
392onLeaveNotDescendants: function(e){
393qq.removeClass(dropArea, self._classes.dropActive);
394},
395onDrop: function(e){
396dropArea.style.display='none';
397qq.removeClass(dropArea, self._classes.dropActive);
398self._uploadFileList(e.dataTransfer.files);
399}});
400dropArea.style.display='none';
401qq.attach(document, 'dragenter', function(e){
402if(!dz._isValidFileDrag(e))
403return;
404dropArea.style.display='block';
405});
406qq.attach(document, 'dragleave', function(e){
407if(!dz._isValidFileDrag(e))
408return;
409var relatedTarget=document.elementFromPoint(e.clientX, e.clientY);
410if(!relatedTarget||relatedTarget.nodeName=="HTML"){
411dropArea.style.display='none';
412}});
413},
414_onSubmit: function(id, fileName){
415qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);
416this._addToList(id, fileName);
417},
418_onProgress: function(id, fileName, loaded, total){
419qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);
420var item=this._getItemByFileId(id);
421var size=this._find(item, 'size');
422size.style.display='inline';
423var text;
424if(loaded!=total){
425text=Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);
426}else{
427text=this._formatSize(total);
428}
429qq.setText(size, text);
430},
431_onComplete: function(id, fileName, result){
432qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);
433var item=this._getItemByFileId(id);
434qq.remove(this._find(item, 'cancel'));
435qq.remove(this._find(item, 'spinner'));
436if(result.success){
437qq.addClass(item, this._classes.success);
438}else{
439qq.addClass(item, this._classes.fail);
440}},
441_addToList: function(id, fileName){
442var item=qq.toElement(this._options.fileTemplate);
443item.qqFileId=id;
444var fileElement=this._find(item, 'file');
445qq.setText(fileElement, this._formatFileName(fileName));
446this._find(item, 'size').style.display='none';
447this._listElement.appendChild(item);
448},
449_getItemByFileId: function(id){
450var item=this._listElement.firstChild;
451while (item){
452if(item.qqFileId==id)
453return item;
454item=item.nextSibling;
455}},
456_bindCancelEvent: function(){
457var self=this,
458list=this._listElement;
459qq.attach(list, 'click', function(e){
460e=e||window.event;
461var target=e.target||e.srcElement;
462if(qq.hasClass(target, self._classes.cancel)){
463qq.preventDefault(e);
464var item=target.parentNode;
465self._handler.cancel(item.qqFileId);
466qq.remove(item);
467}});
468}});
469qq.UploadDropZone=function(o){
470this._options={
471element: null,
472onEnter: function(e){
473},
474onLeave: function(e){
475},
476onLeaveNotDescendants: function(e){
477},
478onDrop: function(e){
479}};
480qq.extend(this._options, o);
481this._element=this._options.element;
482this._disableDropOutside();
483this._attachEvents();
484};
485qq.UploadDropZone.prototype={
486_disableDropOutside: function(e){
487if(!qq.UploadDropZone.dropOutsideDisabled){
488qq.attach(document, 'dragover', function(e){
489if(e.dataTransfer){
490e.dataTransfer.dropEffect='none';
491e.preventDefault();
492}});
493qq.UploadDropZone.dropOutsideDisabled=true;
494}},
495_attachEvents: function(){
496var self=this;
497qq.attach(self._element, 'dragover', function(e){
498if(!self._isValidFileDrag(e))
499return;
500var effect=e.dataTransfer.effectAllowed;
501if(effect=='move'||effect=='linkMove'){
502e.dataTransfer.dropEffect='move';
503}else{
504e.dataTransfer.dropEffect='copy';
505}
506e.stopPropagation();
507e.preventDefault();
508});
509qq.attach(self._element, 'dragenter', function(e){
510if(!self._isValidFileDrag(e))
511return;
512self._options.onEnter(e);
513});
514qq.attach(self._element, 'dragleave', function(e){
515if(!self._isValidFileDrag(e))
516return;
517self._options.onLeave(e);
518var relatedTarget=document.elementFromPoint(e.clientX, e.clientY);
519if(qq.contains(this, relatedTarget))
520return;
521self._options.onLeaveNotDescendants(e);
522});
523qq.attach(self._element, 'drop', function(e){
524if(!self._isValidFileDrag(e))
525return;
526e.preventDefault();
527self._options.onDrop(e);
528});
529},
530_isValidFileDrag: function(e){
531var dt=e.dataTransfer,
532isWebkit=navigator.userAgent.indexOf("AppleWebKit") > -1;
533return dt&&dt.effectAllowed!='none' &&
534(dt.files||(!isWebkit&&dt.types.contains&&dt.types.contains('Files')));
535}};
536qq.UploadButton=function(o){
537this._options={
538element: null,
539multiple: false,
540name: 'file',
541onChange: function(input){
542},
543hoverClass: 'qq-upload-button-hover',
544focusClass: 'qq-upload-button-focus'
545};
546qq.extend(this._options, o);
547this._element=this._options.element;
548qq.css(this._element, {
549position: 'relative',
550overflow: 'hidden',
551direction: 'ltr'
552});
553this._input=this._createInput();
554};
555qq.UploadButton.prototype={
556getInput: function(){
557return this._input;
558},
559reset: function(){
560if(this._input.parentNode){
561qq.remove(this._input);
562}
563qq.removeClass(this._element, this._options.focusClass);
564this._input=this._createInput();
565},
566_createInput: function(){
567var input=document.createElement("input");
568if(this._options.multiple){
569input.setAttribute("multiple", "multiple");
570}
571input.setAttribute("type", "file");
572input.setAttribute("name", this._options.name);
573qq.css(input, {
574position: 'absolute',
575right: 0,
576top: 0,
577fontFamily: 'Arial',
578fontSize: '118px',
579margin: 0,
580padding: 0,
581cursor: 'pointer',
582opacity: 0
583});
584this._element.appendChild(input);
585var self=this;
586qq.attach(input, 'change', function(){
587self._options.onChange(input);
588});
589qq.attach(input, 'mouseover', function(){
590qq.addClass(self._element, self._options.hoverClass);
591});
592qq.attach(input, 'mouseout', function(){
593qq.removeClass(self._element, self._options.hoverClass);
594});
595qq.attach(input, 'focus', function(){
596qq.addClass(self._element, self._options.focusClass);
597});
598qq.attach(input, 'blur', function(){
599qq.removeClass(self._element, self._options.focusClass);
600});
601if(window.attachEvent){
602input.setAttribute('tabIndex', "-1");
603}
604return input;
605}};
606qq.UploadHandlerAbstract=function(o){
607this._options={
608debug: false,
609action: '/upload.php',
610maxConnections: 999,
611onProgress: function(id, fileName, loaded, total){
612},
613onComplete: function(id, fileName, response){
614},
615onCancel: function(id, fileName){
616}};
617qq.extend(this._options, o);
618this._queue=[];
619this._params=[];
620};
621qq.UploadHandlerAbstract.prototype={
622log: function(str){
623if(this._options.debug&&window.console)
624console.log('[uploader] ' + str);
625},
626add: function(file){
627},
628upload: function(id, params){
629var len=this._queue.push(id);
630var copy={};
631qq.extend(copy, params);
632this._params[id]=copy;
633if(len <=this._options.maxConnections){
634this._upload(id, this._params[id]);
635}},
636cancel: function(id){
637this._cancel(id);
638this._dequeue(id);
639},
640cancelAll: function(){
641for (var i=0; i < this._queue.length; i++){
642this._cancel(this._queue[i]);
643}
644this._queue=[];
645},
646getName: function(id){
647},
648getSize: function(id){
649},
650getQueue: function(){
651return this._queue;
652},
653_upload: function(id){
654},
655_cancel: function(id){
656},
657_dequeue: function(id){
658var i=qq.indexOf(this._queue, id);
659this._queue.splice(i, 1);
660var max=this._options.maxConnections;
661if(this._queue.length >=max&&i < max){
662var nextId=this._queue[max - 1];
663this._upload(nextId, this._params[nextId]);
664}}
665};
666qq.UploadHandlerForm=function(o){
667qq.UploadHandlerAbstract.apply(this, arguments);
668this._inputs={};};
669qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);
670qq.extend(qq.UploadHandlerForm.prototype, {
671add: function(fileInput){
672fileInput.setAttribute('name', 'qqfile');
673var id='qq-upload-handler-iframe' + qq.getUniqueId();
674this._inputs[id]=fileInput;
675if(fileInput.parentNode){
676qq.remove(fileInput);
677}
678return id;
679},
680getName: function(id){
681return this._inputs[id].value.replace(/.*(\/|\\)/, "");
682},
683_cancel: function(id){
684this._options.onCancel(id, this.getName(id));
685delete this._inputs[id];
686var iframe=document.getElementById(id);
687if(iframe){
688iframe.setAttribute('src', 'javascript:false;');
689qq.remove(iframe);
690}},
691_upload: function(id, params){
692var input=this._inputs[id];
693if(!input){
694throw new Error('file with passed id was not added, or already uploaded or cancelled');
695}
696var fileName=this.getName(id);
697var iframe=this._createIframe(id);
698var form=this._createForm(iframe, params);
699form.appendChild(input);
700var self=this;
701this._attachLoadEvent(iframe, function(){
702self.log('iframe loaded');
703var response=self._getIframeContentJSON(iframe);
704self._options.onComplete(id, fileName, response);
705self._dequeue(id);
706delete self._inputs[id];
707setTimeout(function(){
708qq.remove(iframe);
709}, 1);
710});
711form.submit();
712qq.remove(form);
713return id;
714},
715_attachLoadEvent: function(iframe, callback){
716qq.attach(iframe, 'load', function(){
717if(!iframe.parentNode){
718return;
719}
720if(iframe.contentDocument &&
721iframe.contentDocument.body &&
722iframe.contentDocument.body.innerHTML=="false"){
723return;
724}
725callback();
726});
727},
728_getIframeContentJSON: function(iframe){
729var doc=iframe.contentDocument ? iframe.contentDocument:iframe.contentWindow.document,
730response;
731this.log("converting iframe's innerHTML to JSON");
732this.log("innerHTML=" + doc.body.innerHTML);
733try {
734response=eval("(" + doc.body.innerHTML + ")");
735} catch (err){
736response={};}
737return response;
738},
739_createIframe: function(id){
740var iframe=qq.toElement('<iframe src="javascript:false;" name="' + id + '" />');
741iframe.setAttribute('id', id);
742iframe.style.display='none';
743document.body.appendChild(iframe);
744return iframe;
745},
746_createForm: function(iframe, params){
747var form=qq.toElement('<form method="post" enctype="multipart/form-data"></form>');
748var queryString=qq.obj2url(params, this._options.action);
749form.setAttribute('action', queryString);
750form.setAttribute('target', iframe.name);
751form.style.display='none';
752document.body.appendChild(form);
753return form;
754}});
755qq.UploadHandlerXhr=function(o){
756qq.UploadHandlerAbstract.apply(this, arguments);
757this._files=[];
758this._xhrs=[];
759this._loaded=[];
760};
761qq.UploadHandlerXhr.isSupported=function(){
762var input=document.createElement('input');
763input.type='file';
764return (
765'multiple' in input &&
766typeof File!="undefined" &&
767typeof (new XMLHttpRequest()).upload!="undefined");
768};
769qq.extend(qq.UploadHandlerXhr.prototype, qq.UploadHandlerAbstract.prototype)
770qq.extend(qq.UploadHandlerXhr.prototype, {
771add: function(file){
772if(!(file instanceof File)){
773throw new Error('Passed obj in not a File (in qq.UploadHandlerXhr)');
774}
775return this._files.push(file) - 1;
776},
777getName: function(id){
778var file=this._files[id];
779return file.fileName!=null ? file.fileName:file.name;
780},
781getSize: function(id){
782var file=this._files[id];
783return file.fileSize!=null ? file.fileSize:file.size;
784},
785getLoaded: function(id){
786return this._loaded[id]||0;
787},
788_upload: function(id, params){
789var file=this._files[id],
790name=this.getName(id),
791size=this.getSize(id);
792this._loaded[id]=0;
793var xhr=this._xhrs[id]=new XMLHttpRequest();
794var self=this;
795xhr.upload.onprogress=function(e){
796if(e.lengthComputable){
797self._loaded[id]=e.loaded;
798self._options.onProgress(id, name, e.loaded, e.total);
799}};
800xhr.onreadystatechange=function(){
801if(xhr.readyState==4){
802self._onComplete(id, xhr);
803}};
804params=params||{};
805params['qqfile']=name;
806var queryString=qq.obj2url(params, this._options.action);
807xhr.open("POST", queryString, true);
808xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
809xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
810xhr.setRequestHeader("Content-Type", "application/octet-stream");
811xhr.send(file);
812},
813_onComplete: function(id, xhr){
814if(!this._files[id])
815return;
816var name=this.getName(id);
817var size=this.getSize(id);
818this._options.onProgress(id, name, size, size);
819if(xhr.status==200){
820this.log("xhr - server response received");
821this.log("responseText=" + xhr.responseText);
822var response;
823try {
824response=eval("(" + xhr.responseText + ")");
825} catch (err){
826response={};}
827this._options.onComplete(id, name, response);
828}else{
829this._options.onComplete(id, name, {});
830}
831this._files[id]=null;
832this._xhrs[id]=null;
833this._dequeue(id);
834},
835_cancel: function(id){
836this._options.onCancel(id, this.getName(id));
837this._files[id]=null;
838if(this._xhrs[id]){
839this._xhrs[id].abort();
840this._xhrs[id]=null;
841}}
842});
843(function($){
844"use strict";
845var methods={
846init: function(options){
847var form=this;
848if(!form.data('jqv')||form.data('jqv')==null){
849options=methods._saveOptions(form, options);
850$(document).on("click", ".formError", function(){
851$(this).fadeOut(150, function(){
852$(this).closest('.formError').remove();
853});
854});
855}
856return this;
857},
858attach: function(userOptions){
859var form=this;
860var options;
861if(userOptions)
862options=methods._saveOptions(form, userOptions);
863else
864options=form.data('jqv');
865options.validateAttribute=(form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine":"class";
866if(options.binded){
867form.on(options.validationEventTrigger, "["+options.validateAttribute+"*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
868form.on("click", "["+options.validateAttribute+"*=validate][type=checkbox],["+options.validateAttribute+"*=validate][type=radio]", methods._onFieldEvent);
869form.on(options.validationEventTrigger,"["+options.validateAttribute+"*=validate][class*=datepicker]", {"delay": 300}, methods._onFieldEvent);
870}
871if(options.autoPositionUpdate){
872$(window).bind("resize", {
873"noAnimation": true,
874"formElem": form
875}, methods.updatePromptsPosition);
876}
877form.on("click","a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
878form.removeData('jqv_submitButton');
879form.on("submit", methods._onSubmitEvent);
880return this;
881},
882detach: function(){
883var form=this;
884var options=form.data('jqv');
885form.off(options.validationEventTrigger, "["+options.validateAttribute+"*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
886form.off("click", "["+options.validateAttribute+"*=validate][type=checkbox],["+options.validateAttribute+"*=validate][type=radio]", methods._onFieldEvent);
887form.off(options.validationEventTrigger,"["+options.validateAttribute+"*=validate][class*=datepicker]", methods._onFieldEvent);
888form.off("submit", methods._onSubmitEvent);
889form.removeData('jqv');
890form.off("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
891form.removeData('jqv_submitButton');
892if(options.autoPositionUpdate)
893$(window).off("resize", methods.updatePromptsPosition);
894return this;
895},
896validate: function(userOptions){
897var element=$(this);
898var valid=null;
899var options;
900if(element.is("form")||element.hasClass("validationEngineContainer")){
901if(element.hasClass('validating')){
902return false;
903}else{
904element.addClass('validating');
905if(userOptions)
906options=methods._saveOptions(element, userOptions);
907else
908options=element.data('jqv');
909var valid=methods._validateFields(this);
910setTimeout(function(){
911element.removeClass('validating');
912}, 100);
913if(valid&&options.onSuccess){
914options.onSuccess();
915}else if(!valid&&options.onFailure){
916options.onFailure();
917}}
918}else if(element.is('form')||element.hasClass('validationEngineContainer')){
919element.removeClass('validating');
920}else{
921var form=element.closest('form, .validationEngineContainer');
922options=(form.data('jqv')) ? form.data('jqv'):$.validationEngine.defaults;
923valid=methods._validateField(element, options);
924if(valid&&options.onFieldSuccess)
925options.onFieldSuccess();
926else if(options.onFieldFailure&&options.InvalidFields.length > 0){
927options.onFieldFailure();
928}
929return !valid;
930}
931if(options.onValidationComplete){
932return !!options.onValidationComplete(form, valid);
933}
934return valid;
935},
936updatePromptsPosition: function(event){
937if(event&&this==window){
938var form=event.data.formElem;
939var noAnimation=event.data.noAnimation;
940}
941else
942var form=$(this.closest('form, .validationEngineContainer'));
943var options=form.data('jqv');
944if(!options)
945options=methods._saveOptions(form, options);
946form.find('['+options.validateAttribute+'*=validate]').not(":disabled").each(function(){
947var field=$(this);
948if(options.prettySelect&&field.is(":hidden"))
949field=form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
950var prompt=methods._getPrompt(field);
951var promptText=$(prompt).find(".formErrorContent").html();
952if(prompt)
953methods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation);
954});
955return this;
956},
957showPrompt: function(promptText, type, promptPosition, showArrow){
958var form=this.closest('form, .validationEngineContainer');
959var options=form.data('jqv');
960if(!options)
961options=methods._saveOptions(this, options);
962if(promptPosition)
963options.promptPosition=promptPosition;
964options.showArrow=showArrow==true;
965methods._showPrompt(this, promptText, type, false, options);
966return this;
967},
968hide: function(){
969var form=$(this).closest('form, .validationEngineContainer');
970var options=form.data('jqv');
971if(!options)
972options=methods._saveOptions(form, options);
973var fadeDuration=(options&&options.fadeDuration) ? options.fadeDuration:0.3;
974var closingtag;
975if(form.is("form")||form.hasClass("validationEngineContainer")){
976closingtag="parentForm"+methods._getClassName($(form).attr("id"));
977}else{
978closingtag=methods._getClassName($(form).attr("id")) +"formError";
979}
980$('.'+closingtag).fadeTo(fadeDuration, 0, function(){
981$(this).closest('.formError').remove();
982});
983return this;
984},
985hideAll: function(){
986var form=this;
987var options=form.data('jqv');
988var duration=options ? options.fadeDuration:300;
989$('.formError').fadeTo(duration, 0, function(){
990$(this).closest('.formError').remove();
991});
992return this;
993},
994_onFieldEvent: function(event){
995var field=$(this);
996var form=field.closest('form, .validationEngineContainer');
997var options=form.data('jqv');
998if(!options)
999options=methods._saveOptions(form, options);
1000options.eventTrigger="field";
1001if(options.notEmpty==true){
1002if(field.val().length > 0){
1003window.setTimeout(function(){
1004methods._validateField(field, options);
1005}, (event.data) ? event.data.delay:0);
1006}}else{
1007window.setTimeout(function(){
1008methods._validateField(field, options);
1009}, (event.data) ? event.data.delay:0);
1010}},
1011_onSubmitEvent: function(){
1012var form=$(this);
1013var options=form.data('jqv');
1014if(form.data("jqv_submitButton")){
1015var submitButton=$("#" + form.data("jqv_submitButton"));
1016if(submitButton){
1017if(submitButton.length > 0){
1018if(submitButton.hasClass("validate-skip")||submitButton.attr("data-validation-engine-skip")=="true")
1019return true;
1020}}
1021}
1022options.eventTrigger="submit";
1023var r=methods._validateFields(form);
1024if(r&&options.ajaxFormValidation){
1025methods._validateFormWithAjax(form, options);
1026return false;
1027}
1028if(options.onValidationComplete){
1029return !!options.onValidationComplete(form, r);
1030}
1031return r;
1032},
1033_checkAjaxStatus: function(options){
1034var status=true;
1035$.each(options.ajaxValidCache, function(key, value){
1036if(!value){
1037status=false;
1038return false;
1039}});
1040return status;
1041},
1042_checkAjaxFieldStatus: function(fieldid, options){
1043return options.ajaxValidCache[fieldid]==true;
1044},
1045_validateFields: function(form){
1046var options=form.data('jqv');
1047var errorFound=false;
1048form.trigger("jqv.form.validating");
1049var first_err=null;
1050form.find('['+options.validateAttribute+'*=validate]').not(":disabled").each(function(){
1051var field=$(this);
1052var names=[];
1053if($.inArray(field.attr('name'), names) < 0){
1054errorFound |=methods._validateField(field, options);
1055if(errorFound&&first_err==null)
1056if(field.is(":hidden")&&options.prettySelect)
1057first_err=field=form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
1058else {
1059if(field.data('jqv-prompt-at') instanceof jQuery){
1060field=field.data('jqv-prompt-at');
1061}else if(field.data('jqv-prompt-at')){
1062field=$(field.data('jqv-prompt-at'));
1063}
1064first_err=field;
1065}
1066if(options.doNotShowAllErrosOnSubmit)
1067return false;
1068names.push(field.attr('name'));
1069if(options.showOneMessage==true&&errorFound){
1070return false;
1071}}
1072});
1073form.trigger("jqv.form.result", [errorFound]);
1074if(errorFound){
1075if(options.scroll){
1076var destination=first_err.offset().top;
1077var fixleft=first_err.offset().left;
1078var positionType=options.promptPosition;
1079if(typeof(positionType)=='string'&&positionType.indexOf(":")!=-1)
1080positionType=positionType.substring(0,positionType.indexOf(":"));
1081if(positionType!="bottomRight"&&positionType!="bottomLeft"){
1082var prompt_err=methods._getPrompt(first_err);
1083if(prompt_err){
1084destination=prompt_err.offset().top;
1085}}
1086if(options.scrollOffset){
1087destination -=options.scrollOffset;
1088}
1089if(options.isOverflown){
1090var overflowDIV=$(options.overflownDIV);
1091if(!overflowDIV.length) return false;
1092var scrollContainerScroll=overflowDIV.scrollTop();
1093var scrollContainerPos=-parseInt(overflowDIV.offset().top);
1094destination +=scrollContainerScroll + scrollContainerPos - 5;
1095var scrollContainer=$(options.overflownDIV).filter(":not(:animated)");
1096scrollContainer.animate({ scrollTop: destination }, 1100, function(){
1097if(options.focusFirstField) first_err.focus();
1098});
1099}else{
1100$("html, body").animate({
1101scrollTop: destination
1102}, 1100, function(){
1103if(options.focusFirstField) first_err.focus();
1104});
1105$("html, body").animate({scrollLeft: fixleft},1100)
1106}}else if(options.focusFirstField)
1107first_err.focus();
1108return false;
1109}
1110return true;
1111},
1112_validateFormWithAjax: function(form, options){
1113var data=form.serialize();
1114var type=(options.ajaxFormValidationMethod) ? options.ajaxFormValidationMethod:"GET";
1115var url=(options.ajaxFormValidationURL) ? options.ajaxFormValidationURL:form.attr("action");
1116var dataType=(options.dataType) ? options.dataType:"json";
1117$.ajax({
1118type: type,
1119url: url,
1120cache: false,
1121dataType: dataType,
1122data: data,
1123form: form,
1124methods: methods,
1125options: options,
1126beforeSend: function(){
1127return options.onBeforeAjaxFormValidation(form, options);
1128},
1129error: function(data, transport){
1130if(options.onFailure){
1131options.onFailure(data, transport);
1132}else{
1133methods._ajaxError(data, transport);
1134}},
1135success: function(json){
1136if((dataType=="json")&&(json!==true)){
1137var errorInForm=false;
1138for (var i=0; i < json.length; i++){
1139var value=json[i];
1140var errorFieldId=value[0];
1141var errorField=$($("#" + errorFieldId)[0]);
1142if(errorField.length==1){
1143var msg=value[2];
1144if(value[1]==true){
1145if(msg==""||!msg){
1146methods._closePrompt(errorField);
1147}else{
1148if(options.allrules[msg]){
1149var txt=options.allrules[msg].alertTextOk;
1150if(txt)
1151msg=txt;
1152}
1153if(options.showPrompts) methods._showPrompt(errorField, msg, "pass", false, options, true);
1154}}else{
1155errorInForm|=true;
1156if(options.allrules[msg]){
1157var txt=options.allrules[msg].alertText;
1158if(txt)
1159msg=txt;
1160}
1161if(options.showPrompts) methods._showPrompt(errorField, msg, "", false, options, true);
1162}}
1163}
1164options.onAjaxFormComplete(!errorInForm, form, json, options);
1165} else
1166options.onAjaxFormComplete(true, form, json, options);
1167}});
1168},
1169_validateField: function(field, options, skipAjaxValidation){
1170if(!field.attr("id")){
1171field.attr("id", "form-validation-field-" + $.validationEngine.fieldIdCounter);
1172++$.validationEngine.fieldIdCounter;
1173}
1174if(field.hasClass(options.ignoreFieldsWithClass))
1175return false;
1176if(!options.validateNonVisibleFields&&(field.is(":hidden")&&!options.prettySelect||field.parent().is(":hidden")))
1177return false;
1178var rulesParsing=field.attr(options.validateAttribute);
1179var getRules=/validate\[(.*)\]/.exec(rulesParsing);
1180if(!getRules)
1181return false;
1182var str=getRules[1];
1183var rules=str.split(/\[|,|\]/);
1184var isAjaxValidator=false;
1185var fieldName=field.attr("name");
1186var promptText="";
1187var promptType="";
1188var required=false;
1189var limitErrors=false;
1190options.isError=false;
1191options.showArrow=options.showArrow==true;
1192if(options.maxErrorsPerField > 0){
1193limitErrors=true;
1194}
1195var form=$(field.closest("form, .validationEngineContainer"));
1196for (var i=0; i < rules.length; i++){
1197rules[i]=rules[i].toString().replace(" ", "");
1198if(rules[i]===''){
1199delete rules[i];
1200}}
1201for (var i=0, field_errors=0; i < rules.length; i++){
1202if(limitErrors&&field_errors >=options.maxErrorsPerField){
1203if(!required){
1204var have_required=$.inArray('required', rules);
1205required=(have_required!=-1&&have_required >=i);
1206}
1207break;
1208}
1209var errorMsg=undefined;
1210switch (rules[i]){
1211case "required":
1212required=true;
1213errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);
1214break;
1215case "custom":
1216errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);
1217break;
1218case "groupRequired":
1219var classGroup="["+options.validateAttribute+"*=" +rules[i + 1] +"]";
1220var firstOfGroup=form.find(classGroup).eq(0);
1221if(firstOfGroup[0]!=field[0]){
1222methods._validateField(firstOfGroup, options, skipAjaxValidation);
1223options.showArrow=true;
1224}
1225errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);
1226if(errorMsg)  required=true;
1227options.showArrow=false;
1228break;
1229case "ajax":
1230errorMsg=methods._ajax(field, rules, i, options);
1231if(errorMsg){
1232promptType="load";
1233}
1234break;
1235case "minSize":
1236errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);
1237break;
1238case "maxSize":
1239errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);
1240break;
1241case "min":
1242errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);
1243break;
1244case "max":
1245errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);
1246break;
1247case "past":
1248errorMsg=methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._past);
1249break;
1250case "future":
1251errorMsg=methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._future);
1252break;
1253case "dateRange":
1254var classGroup="["+options.validateAttribute+"*=" + rules[i + 1] + "]";
1255options.firstOfGroup=form.find(classGroup).eq(0);
1256options.secondOfGroup=form.find(classGroup).eq(1);
1257if(options.firstOfGroup[0].value||options.secondOfGroup[0].value){
1258errorMsg=methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateRange);
1259}
1260if(errorMsg) required=true;
1261options.showArrow=false;
1262break;
1263case "dateTimeRange":
1264var classGroup="["+options.validateAttribute+"*=" + rules[i + 1] + "]";
1265options.firstOfGroup=form.find(classGroup).eq(0);
1266options.secondOfGroup=form.find(classGroup).eq(1);
1267if(options.firstOfGroup[0].value||options.secondOfGroup[0].value){
1268errorMsg=methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateTimeRange);
1269}
1270if(errorMsg) required=true;
1271options.showArrow=false;
1272break;
1273case "maxCheckbox":
1274field=$(form.find("input[name='" + fieldName + "']"));
1275errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);
1276break;
1277case "minCheckbox":
1278field=$(form.find("input[name='" + fieldName + "']"));
1279errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);
1280break;
1281case "equals":
1282errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);
1283break;
1284case "funcCall":
1285errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);
1286break;
1287case "creditCard":
1288errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);
1289break;
1290case "condRequired":
1291errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._c
1291ondRequired);
1292if(errorMsg!==undefined){
1293required=true;
1294}
1295break;
1296case "funcCallRequired":
1297errorMsg=methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCallRequired);
1298if(errorMsg!==undefined){
1299required=true;
1300}
1301break;
1302default:
1303}
1304var end_validation=false;
1305if(typeof errorMsg=="object"){
1306switch (errorMsg.status){
1307case "_break":
1308end_validation=true;
1309break;
1310case "_error":
1311errorMsg=errorMsg.message;
1312break;
1313case "_error_no_prompt":
1314return true;
1315break;
1316default:
1317break;
1318}}
1319if(i==0&&str.indexOf('funcCallRequired')==0&&errorMsg!==undefined){
1320if(promptText!=''){
1321promptText +="<br/>";
1322}
1323promptText +=errorMsg;
1324options.isError=true;
1325field_errors++;
1326end_validation=true;
1327}
1328if(end_validation){
1329break;
1330}
1331if(typeof errorMsg=='string'){
1332if(promptText!=''){
1333promptText +="<br/>";
1334}
1335promptText +=errorMsg;
1336options.isError=true;
1337field_errors++;
1338}}
1339if(!required&&!(field.val())&&field.val().length < 1&&$.inArray('equals', rules) < 0) options.isError=false;
1340var fieldType=field.prop("type");
1341var positionType=field.data("promptPosition")||options.promptPosition;
1342if((fieldType=="radio"||fieldType=="checkbox")&&form.find("input[name='" + fieldName + "']").length > 1){
1343if(positionType==='inline'){
1344field=$(form.find("input[name='" + fieldName + "'][type!=hidden]:last"));
1345}else{
1346field=$(form.find("input[name='" + fieldName + "'][type!=hidden]:first"));
1347}
1348options.showArrow=options.showArrowOnRadioAndCheckbox;
1349}
1350if(field.is(":hidden")&&options.prettySelect){
1351field=form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
1352}
1353if(options.isError&&options.showPrompts){
1354methods._showPrompt(field, promptText, promptType, false, options);
1355}else{
1356if(!isAjaxValidator) methods._closePrompt(field);
1357}
1358if(!isAjaxValidator){
1359field.trigger("jqv.field.result", [field, options.isError, promptText]);
1360}
1361var errindex=$.inArray(field[0], options.InvalidFields);
1362if(errindex==-1){
1363if(options.isError)
1364options.InvalidFields.push(field[0]);
1365}else if(!options.isError){
1366options.InvalidFields.splice(errindex, 1);
1367}
1368methods._handleStatusCssClasses(field, options);
1369if(options.isError&&options.onFieldFailure)
1370options.onFieldFailure(field);
1371if(!options.isError&&options.onFieldSuccess)
1372options.onFieldSuccess(field);
1373return options.isError;
1374},
1375_handleStatusCssClasses: function(field, options){
1376if(options.addSuccessCssClassToField)
1377field.removeClass(options.addSuccessCssClassToField);
1378if(options.addFailureCssClassToField)
1379field.removeClass(options.addFailureCssClassToField);
1380if(options.addSuccessCssClassToField&&!options.isError)
1381field.addClass(options.addSuccessCssClassToField);
1382if(options.addFailureCssClassToField&&options.isError)
1383field.addClass(options.addFailureCssClassToField);
1384},
1385_getErrorMessage:function (form, field, rule, rules, i, options, originalValidationMethod){
1386var rule_index=jQuery.inArray(rule, rules);
1387if(rule==="custom"||rule==="funcCall"||rule==="funcCallRequired"){
1388var custom_validation_type=rules[rule_index + 1];
1389rule=rule + "[" + custom_validation_type + "]";
1390delete(rules[rule_index]);
1391}
1392var alteredRule=rule;
1393var element_classes=(field.attr("data-validation-engine")) ? field.attr("data-validation-engine"):field.attr("class");
1394var element_classes_array=element_classes.split(" ");
1395var errorMsg;
1396if(rule=="future"||rule=="past"||rule=="maxCheckbox"||rule=="minCheckbox"){
1397errorMsg=originalValidationMethod(form, field, rules, i, options);
1398}else{
1399errorMsg=originalValidationMethod(field, rules, i, options);
1400}
1401if(errorMsg!=undefined){
1402var custom_message=methods._getCustomErrorMessage($(field), element_classes_array, alteredRule, options);
1403if(custom_message) errorMsg=custom_message;
1404}
1405return errorMsg;
1406},
1407_getCustomErrorMessage:function (field, classes, rule, options){
1408var custom_message=false;
1409var validityProp=/^custom\[.*\]$/.test(rule) ? methods._validityProp["custom"]:methods._validityProp[rule];
1410if(validityProp!=undefined){
1411custom_message=field.attr("data-errormessage-"+validityProp);
1412if(custom_message!=undefined)
1413return custom_message;
1414}
1415custom_message=field.attr("data-errormessage");
1416if(custom_message!=undefined)
1417return custom_message;
1418var id='#' + field.attr("id");
1419if(typeof options.custom_error_messages[id]!="undefined" &&
1420typeof options.custom_error_messages[id][rule]!="undefined"){
1421custom_message=options.custom_error_messages[id][rule]['message'];
1422}else if(classes.length > 0){
1423for (var i=0; i < classes.length&&classes.length > 0; i++){
1424var element_class="." + classes[i];
1425if(typeof options.custom_error_messages[element_class]!="undefined" &&
1426typeof options.custom_error_messages[element_class][rule]!="undefined"){
1427custom_message=options.custom_error_messages[element_class][rule]['message'];
1428break;
1429}}
1430}
1431if(!custom_message &&
1432typeof options.custom_error_messages[rule]!="undefined" &&
1433typeof options.custom_error_messages[rule]['message']!="undefined"){
1434custom_message=options.custom_error_messages[rule]['message'];
1435}
1436return custom_message;
1437},
1438_validityProp: {
1439"required": "value-missing",
1440"custom": "custom-error",
1441"groupRequired": "value-missing",
1442"ajax": "custom-error",
1443"minSize": "range-underflow",
1444"maxSize": "range-overflow",
1445"min": "range-underflow",
1446"max": "range-overflow",
1447"past": "type-mismatch",
1448"future": "type-mismatch",
1449"dateRange": "type-mismatch",
1450"dateTimeRange": "type-mismatch",
1451"maxCheckbox": "range-overflow",
1452"minCheckbox": "range-underflow",
1453"equals": "pattern-mismatch",
1454"funcCall": "custom-error",
1455"funcCallRequired": "custom-error",
1456"creditCard": "pattern-mismatch",
1457"condRequired": "value-missing"
1458},
1459_required: function(field, rules, i, options, condRequired){
1460switch (field.prop("type")){
1461case "radio":
1462case "checkbox":
1463if(condRequired){
1464if(!field.prop('checked')){
1465return options.allrules[rules[i]].alertTextCheckboxMultiple;
1466}
1467break;
1468}
1469var form=field.closest("form, .validationEngineContainer");
1470var name=field.attr("name");
1471if(form.find("input[name='" + name + "']:checked").length==0){
1472if(form.find("input[name='" + name + "']:visible").length==1)
1473return options.allrules[rules[i]].alertTextCheckboxe;
1474else
1475return options.allrules[rules[i]].alertTextCheckboxMultiple;
1476}
1477break;
1478case "text":
1479case "password":
1480case "textarea":
1481case "file":
1482case "select-one":
1483case "select-multiple":
1484default:
1485var field_val=$.trim(field.val());
1486var dv_placeholder=$.trim(field.attr("data-validation-placeholder"));
1487var placeholder=$.trim(field.attr("placeholder"));
1488if((!field_val)
1489||(dv_placeholder&&field_val==dv_placeholder)
1490||(placeholder&&field_val==placeholder)
1491){
1492return options.allrules[rules[i]].alertText;
1493}
1494break;
1495}},
1496_groupRequired: function(field, rules, i, options){
1497var classGroup="["+options.validateAttribute+"*=" +rules[i + 1] +"]";
1498var isValid=false;
1499field.closest("form, .validationEngineContainer").find(classGroup).each(function(){
1500if(!methods._required($(this), rules, i, options)){
1501isValid=true;
1502return false;
1503}});
1504if(!isValid){
1505return options.allrules[rules[i]].alertText;
1506}},
1507_custom: function(field, rules, i, options){
1508var customRule=rules[i + 1];
1509var rule=options.allrules[customRule];
1510var fn;
1511if(!rule){
1512alert("jqv:custom rule not found - "+customRule);
1513return;
1514}
1515if(rule["regex"]){
1516var ex=rule.regex;
1517if(!ex){
1518alert("jqv:custom regex not found - "+customRule);
1519return;
1520}
1521var pattern=new RegExp(ex);
1522if(!pattern.test(field.val())) return options.allrules[customRule].alertText;
1523}else if(rule["func"]){
1524fn=rule["func"];
1525if(typeof(fn)!=="function"){
1526alert("jqv:custom parameter 'function' is no function - "+customRule);
1527return;
1528}
1529if(!fn(field, rules, i, options))
1530return options.allrules[customRule].alertText;
1531}else{
1532alert("jqv:custom type not allowed "+customRule);
1533return;
1534}},
1535_funcCall: function(field, rules, i, options){
1536var functionName=rules[i + 1];
1537var fn;
1538if(functionName.indexOf('.') >-1){
1539var namespaces=functionName.split('.');
1540var scope=window;
1541while(namespaces.length){
1542scope=scope[namespaces.shift()];
1543}
1544fn=scope;
1545}
1546else
1547fn=window[functionName]||options.customFunctions[functionName];
1548if(typeof(fn)=='function')
1549return fn(field, rules, i, options);
1550},
1551_funcCallRequired: function(field, rules, i, options){
1552return methods._funcCall(field,rules,i,options);
1553},
1554_equals: function(field, rules, i, options){
1555var equalsField=rules[i + 1];
1556if(field.val()!=$("#" + equalsField).val())
1557return options.allrules.equals.alertText;
1558},
1559_maxSize: function(field, rules, i, options){
1560var max=rules[i + 1];
1561var len=field.val().length;
1562if(len > max){
1563var rule=options.allrules.maxSize;
1564return rule.alertText + max + rule.alertText2;
1565}},
1566_minSize: function(field, rules, i, options){
1567var min=rules[i + 1];
1568var len=field.val().length;
1569if(len < min){
1570var rule=options.allrules.minSize;
1571return rule.alertText + min + rule.alertText2;
1572}},
1573_min: function(field, rules, i, options){
1574var min=parseFloat(rules[i + 1]);
1575var len=parseFloat(field.val());
1576if(len < min){
1577var rule=options.allrules.min;
1578if(rule.alertText2) return rule.alertText + min + rule.alertText2;
1579return rule.alertText + min;
1580}},
1581_max: function(field, rules, i, options){
1582var max=parseFloat(rules[i + 1]);
1583var len=parseFloat(field.val());
1584if(len >max){
1585var rule=options.allrules.max;
1586if(rule.alertText2) return rule.alertText + max + rule.alertText2;
1587return rule.alertText + max;
1588}},
1589_past: function(form, field, rules, i, options){
1590var p=rules[i + 1];
1591var fieldAlt=$(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
1592var pdate;
1593if(p.toLowerCase()=="now"){
1594pdate=new Date();
1595}else if(undefined!=fieldAlt.val()){
1596if(fieldAlt.is(":disabled"))
1597return;
1598pdate=methods._parseDate(fieldAlt.val());
1599}else{
1600pdate=methods._parseDate(p);
1601}
1602var vdate=methods._parseDate(field.val());
1603if(vdate > pdate){
1604var rule=options.allrules.past;
1605if(rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
1606return rule.alertText + methods._dateToString(pdate);
1607}},
1608_future: function(form, field, rules, i, options){
1609var p=rules[i + 1];
1610var fieldAlt=$(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
1611var pdate;
1612if(p.toLowerCase()=="now"){
1613pdate=new Date();
1614}else if(undefined!=fieldAlt.val()){
1615if(fieldAlt.is(":disabled"))
1616return;
1617pdate=methods._parseDate(fieldAlt.val());
1618}else{
1619pdate=methods._parseDate(p);
1620}
1621var vdate=methods._parseDate(field.val());
1622if(vdate < pdate){
1623var rule=options.allrules.future;
1624if(rule.alertText2)
1625return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
1626return rule.alertText + methods._dateToString(pdate);
1627}},
1628_isDate: function (value){
1629var dateRegEx=new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/);
1630return dateRegEx.test(value);
1631},
1632_isDateTime: function (value){
1633var dateTimeRegEx=new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}
1633$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/);
1634return dateTimeRegEx.test(value);
1635},
1636_dateCompare: function (start, end){
1637return (new Date(start.toString()) < new Date(end.toString()));
1638},
1639_dateRange: function (field, rules, i, options){
1640if((!options.firstOfGroup[0].value&&options.secondOfGroup[0].value)||(options.firstOfGroup[0].value&&!options.secondOfGroup[0].value)){
1641return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1642}
1643if(!methods._isDate(options.firstOfGroup[0].value)||!methods._isDate(options.secondOfGroup[0].value)){
1644return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1645}
1646if(!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)){
1647return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1648}},
1649_dateTimeRange: function (field, rules, i, options){
1650if((!options.firstOfGroup[0].value&&options.secondOfGroup[0].value)||(options.firstOfGroup[0].value&&!options.secondOfGroup[0].value)){
1651return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1652}
1653if(!methods._isDateTime(options.firstOfGroup[0].value)||!methods._isDateTime(options.secondOfGroup[0].value)){
1654return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1655}
1656if(!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)){
1657return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1658}},
1659_maxCheckbox: function(form, field, rules, i, options){
1660var nbCheck=rules[i + 1];
1661var groupname=field.attr("name");
1662var groupSize=form.find("input[name='" + groupname + "']:checked").length;
1663if(groupSize > nbCheck){
1664options.showArrow=false;
1665if(options.allrules.maxCheckbox.alertText2)
1666return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
1667return options.allrules.maxCheckbox.alertText;
1668}},
1669_minCheckbox: function(form, field, rules, i, options){
1670var nbCheck=rules[i + 1];
1671var groupname=field.attr("name");
1672var groupSize=form.find("input[name='" + groupname + "']:checked").length;
1673if(groupSize < nbCheck){
1674options.showArrow=false;
1675return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + options.allrules.minCheckbox.alertText2;
1676}},
1677_creditCard: function(field, rules, i, options){
1678var valid=false, cardNumber=field.val().replace(/ +/g, '').replace(/-+/g, '');
1679var numDigits=cardNumber.length;
1680if(numDigits >=14&&numDigits <=16&&parseInt(cardNumber) > 0){
1681var sum=0, i=numDigits - 1, pos=1, digit, luhn=new String();
1682do {
1683digit=parseInt(cardNumber.charAt(i));
1684luhn +=(pos++ % 2==0) ? digit * 2:digit;
1685} while (--i >=0)
1686for (i=0; i < luhn.length; i++){
1687sum +=parseInt(luhn.charAt(i));
1688}
1689valid=sum % 10==0;
1690}
1691if(!valid) return options.allrules.creditCard.alertText;
1692},
1693_ajax: function(field, rules, i, options){
1694var errorSelector=rules[i + 1];
1695var rule=options.allrules[errorSelector];
1696var extraData=rule.extraData;
1697var extraDataDynamic=rule.extraDataDynamic;
1698var data={
1699"fieldId":field.attr("id"),
1700"fieldValue":field.val()
1701};
1702if(typeof extraData==="object"){
1703$.extend(data, extraData);
1704}else if(typeof extraData==="string"){
1705var tempData=extraData.split("&");
1706for(var i=0; i < tempData.length; i++){
1707var values=tempData[i].split("=");
1708if(values[0]&&values[0]){
1709data[values[0]]=values[1];
1710}}
1711}
1712if(extraDataDynamic){
1713var tmpData=[];
1714var domIds=String(extraDataDynamic).split(",");
1715for (var i=0; i < domIds.length; i++){
1716var id=domIds[i];
1717if($(id).length){
1718var inputValue=field.closest("form, .validationEngineContainer").find(id).val();
1719var keyValue=id.replace('#', '') + '=' + escape(inputValue);
1720data[id.replace('#', '')]=inputValue;
1721}}
1722}
1723if(options.eventTrigger=="field"){
1724delete(options.ajaxValidCache[field.attr("id")]);
1725}
1726if(!options.isError&&!methods._checkAjaxFieldStatus(field.attr("id"), options)){
1727$.ajax({
1728type: options.ajaxFormValidationMethod,
1729url: rule.url,
1730cache: false,
1731dataType: "json",
1732data: data,
1733field: field,
1734rule: rule,
1735methods: methods,
1736options: options,
1737beforeSend: function(){},
1738error: function(data, transport){
1739if(options.onFailure){
1740options.onFailure(data, transport);
1741}else{
1742methods._ajaxError(data, transport);
1743}},
1744success: function(json){
1745var errorFieldId=json[0];
1746var errorField=$("#"+ errorFieldId).eq(0);
1747if(errorField.length==1){
1748var status=json[1];
1749var msg=json[2];
1750if(!status){
1751options.ajaxValidCache[errorFieldId]=false;
1752options.isError=true;
1753if(msg){
1754if(options.allrules[msg]){
1755var txt=options.allrules[msg].alertText;
1756if(txt){
1757msg=txt;
1758}}
1759}
1760else
1761msg=rule.alertText;
1762if(options.showPrompts) methods._showPrompt(errorField, msg, "", true, options);
1763}else{
1764options.ajaxValidCache[errorFieldId]=true;
1765if(msg){
1766if(options.allrules[msg]){
1767var txt=options.allrules[msg].alertTextOk;
1768if(txt){
1769msg=txt;
1770}}
1771}
1772else
1773msg=rule.alertTextOk;
1774if(options.showPrompts){
1775if(msg)
1776methods._showPrompt(errorField, msg, "pass", true, options);
1777else
1778methods._closePrompt(errorField);
1779}
1780if(options.eventTrigger=="submit")
1781field.closest("form").submit();
1782}}
1783errorField.trigger("jqv.field.result", [errorField, options.isError, msg]);
1784}});
1785return rule.alertTextLoad;
1786}},
1787_ajaxError: function(data, transport){
1788if(data.status==0&&transport==null)
1789alert("The page is not served from a server! ajax call failed");
1790else if(typeof console!="undefined")
1791console.log("Ajax error: " + data.status + " " + transport);
1792},
1793_dateToString: function(date){
1794return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
1795},
1796_parseDate: function(d){
1797var dateParts=d.split("-");
1798if(dateParts==d)
1799dateParts=d.split("/");
1800if(dateParts==d){
1801dateParts=d.split(".");
1802return new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
1803}
1804return new Date(dateParts[0], (dateParts[1] - 1) ,dateParts[2]);
1805},
1806_showPrompt: function(field, promptText, type, ajaxed, options, ajaxform){
1807if(field.data('jqv-prompt-at') instanceof jQuery){
1808field=field.data('jqv-prompt-at');
1809}else if(field.data('jqv-prompt-at')){
1810field=$(field.data('jqv-prompt-at'));
1811}
1812var prompt=methods._getPrompt(field);
1813if(ajaxform) prompt=false;
1814if($.trim(promptText)){
1815if(prompt)
1816methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
1817else
1818methods._buildPrompt(field, promptText, type, ajaxed, options);
1819}},
1820_buildPrompt: function(field, promptText, type, ajaxed, options){
1821var prompt=$('<div>');
1822prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
1823prompt.addClass("parentForm"+methods._getClassName(field.closest('form, .validationEngineContainer').attr("id")));
1824prompt.addClass("formError");
1825switch (type){
1826case "pass":
1827prompt.addClass("greenPopup");
1828break;
1829case "load":
1830prompt.addClass("blackPopup");
1831break;
1832default:
1833}
1834if(ajaxed)
1835prompt.addClass("ajaxed");
1836var promptContent=$('<div>').addClass("formErrorContent").html(promptText).appendTo(prompt);
1837var positionType=field.data("promptPosition")||options.promptPosition;
1838if(options.showArrow){
1839var arrow=$('<div>').addClass("formErrorArrow");
1840if(typeof(positionType)=='string'){
1841var pos=positionType.indexOf(":");
1842if(pos!=-1)
1843positionType=positionType.substring(0,pos);
1844}
1845switch (positionType){
1846case "bottomLeft":
1847case "bottomRight":
1848prompt.find(".formErrorContent").before(arrow);
1849arrow.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
1850break;
1851case "topLeft":
1852case "topRight":
1853arrow.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
1854prompt.append(arrow);
1855break;
1856}}
1857if(options.addPromptClass)
1858prompt.addClass(options.addPromptClass);
1859var requiredOverride=field.attr('data-required-class');
1860if(requiredOverride!==undefined){
1861prompt.addClass(requiredOverride);
1862}else{
1863if(options.prettySelect){
1864if($('#' + field.attr('id')).next().is('select')){
1865var prettyOverrideClass=$('#' + field.attr('id').substr(options.usePrefix.length).substring(options.useSuffix.length)).attr('data-required-class');
1866if(prettyOverrideClass!==undefined){
1867prompt.addClass(prettyOverrideClass);
1868}}
1869}}
1870prompt.css({
1871"opacity": 0
1872});
1873if(positionType==='inline'){
1874prompt.addClass("inline");
1875if(typeof field.attr('data-prompt-target')!=='undefined'&&$('#'+field.attr('data-prompt-target')).length > 0){
1876prompt.appendTo($('#'+field.attr('data-prompt-target')));
1877}else{
1878field.after(prompt);
1879}}else{
1880field.before(prompt);
1881}
1882var pos=methods._calculatePosition(field, prompt, options);
1883if($('body').hasClass('rtl')){
1884prompt.css({
1885'position': positionType==='inline' ? 'relative':'absolute',
1886"top": pos.callerTopPosition,
1887"left": "initial",
1888"right": pos.callerleftPosition,
1889"marginTop": pos.marginTopSize,
1890"opacity": 0
1891}).data("callerField", field);
1892}else{
1893prompt.css({
1894'position': positionType==='inline' ? 'relative':'absolute',
1895"top": pos.callerTopPosition,
1896"left": pos.callerleftPosition,
1897"right": "initial",
1898"marginTop": pos.marginTopSize,
1899"opacity": 0
1900}).data("callerField", field);
1901}
1902if(options.autoHidePrompt){
1903setTimeout(function(){
1904prompt.animate({
1905"opacity": 0
1906},function(){
1907prompt.closest('.formError').remove();
1908});
1909}, options.autoHideDelay);
1910}
1911return prompt.animate({
1912"opacity": 0.87
1913});
1914},
1915_updatePrompt: function(field, prompt, promptText, type, ajaxed, options, noAnimation){
1916if(prompt){
1917if(typeof type!=="undefined"){
1918if(type=="pass")
1919prompt.addClass("greenPopup");
1920else
1921prompt.removeClass("greenPopup");
1922if(type=="load")
1923prompt.addClass("blackPopup");
1924else
1925prompt.removeClass("blackPopup");
1926}
1927if(ajaxed)
1928prompt.addClass("ajaxed");
1929else
1930prompt.removeClass("ajaxed");
1931prompt.find(".formErrorContent").html(promptText);
1932var pos=methods._calculatePosition(field, prompt, options);
1933if($('body').hasClass('rtl')){
1934var css={"top": pos.callerTopPosition,
1935"left": "initial",
1936"right": pos.callerleftPosition,
1937"marginTop": pos.marginTopSize,
1938"opacity": 0.87};}else{
1939var css={"top": pos.callerTopPosition,
1940"left": pos.callerleftPosition,
1941"right": "initial",
1942"marginTop": pos.marginTopSize,
1943"opacity": 0.87};}
1944prompt.css({
1945"opacity": 0,
1946"display": "block"
1947});
1948if(noAnimation)
1949prompt.css(css);
1950else
1951prompt.animate(css);
1952}},
1953_closePrompt: function(field){
1954var prompt=methods._getPrompt(field);
1955if(prompt)
1956prompt.fadeTo("fast", 0, function(){
1957prompt.closest('.formError').remove();
1958});
1959},
1960closePrompt: function(field){
1961return methods._closePrompt(field);
1962},
1963_getPrompt: function(field){
1964var formId=$(field).closest('form, .validationEngineContainer').attr('id');
1965var className=methods._getClassName(field.attr("id")) + "formError";
1966var match=$("." + methods._escapeExpression(className) + '.parentForm' + methods._getClassName(formId))[0];
1967if(match)
1968return $(match);
1969},
1970_escapeExpression: function (selector){
1971return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1");
1972},
1973isRTL: function(field){
1974var $document=$(document);
1975var $body=$('body');
1976var rtl =
1977(field&&field.hasClass('rtl')) ||
1978(field&&(field.attr('dir')||'').toLowerCase()==='rtl') ||
1979$document.hasClass('rtl') ||
1980($document.attr('dir')||'').toLowerCase()==='rtl' ||
1981$body.hasClass('rtl') ||
1982($body.attr('dir')||'').toLowerCase()==='rtl';
1983return Boolean(rtl);
1984},
1985_calculatePosition: function (field, promptElmt, options){
1986var promptTopPosition, promptleftPosition, marginTopSize;
1987var fieldWidth=field.width();
1988var fieldLeft=field.position().left;
1989var fieldTop=field.position().top;
1990var fieldHeight=field.height();
1991var promptHeight=promptElmt.height();
1992promptTopPosition=promptleftPosition=0;
1993marginTopSize=-promptHeight;
1994var positionType=field.data("promptPosition")||options.promptPosition;
1995var shift1="";
1996var shift2="";
1997var shiftX=0;
1998var shiftY=0;
1999if(typeof(positionType)=='string'){
2000if(positionType.indexOf(":")!=-1){
2001shift1=positionType.substring(positionType.indexOf(":")+1);
2002positionType=positionType.substring(0,positionType.indexOf(":"));
2003if(shift1.indexOf(",")!=-1){
2004shift2=shift1.substring(shift1.indexOf(",") +1);
2005shift1=shift1.substring(0,shift1.indexOf(","));
2006shiftY=parseInt(shift2);
2007if(isNaN(shiftY)) shiftY=0;
2008};
2009shiftX=parseInt(shift1);
2010if(isNaN(shift1)) shift1=0;
2011};};
2012switch (positionType){
2013default:
2014case "topRight":
2015promptleftPosition +=fieldLeft + fieldWidth - 27;
2016promptTopPosition +=fieldTop;
2017break;
2018case "topLeft":
2019promptTopPosition +=fieldTop;
2020promptleftPosition +=fieldLeft;
2021break;
2022case "centerRight":
2023promptTopPosition=fieldTop+4;
2024marginTopSize=0;
2025promptleftPosition=fieldLeft + field.outerWidth(true)+5;
2026break;
2027case "centerLeft":
2028promptleftPosition=fieldLeft - (promptElmt.width() + 2);
2029promptTopPosition=fieldTop+4;
2030marginTopSize=0;
2031break;
2032case "bottomLeft":
2033promptTopPosition=fieldTop + field.height() + 5;
2034marginTopSize=0;
2035promptleftPosition=fieldLeft;
2036break;
2037case "bottomRight":
2038promptleftPosition=fieldLeft + fieldWidth - 27;
2039promptTopPosition=fieldTop +  field.height() + 5;
2040marginTopSize=0;
2041break;
2042case "inline":
2043promptleftPosition=0;
2044promptTopPosition=0;
2045marginTopSize=0;
2046};
2047promptleftPosition +=shiftX;
2048promptTopPosition  +=shiftY;
2049return {
2050"callerTopPosition": promptTopPosition + "px",
2051"callerleftPosition": promptleftPosition + "px",
2052"marginTopSize": marginTopSize + "px"
2053};},
2054_saveOptions: function(form, options){
2055if($.validationEngineLanguage)
2056var allRules=$.validationEngineLanguage.allRules;
2057else
2058$.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
2059$.validationEngine.defaults.allrules=allRules;
2060var userOptions=$.extend(true,{},$.validationEngine.defaults,options);
2061form.data('jqv', userOptions);
2062return userOptions;
2063},
2064_getClassName: function(className){
2065if(className)
2066return className.replace(/:/g, "_").replace(/\./g, "_");
2067},
2068_jqSelector: function(str){
2069return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
2070},
2071_condRequired: function(field, rules, i, options){
2072var idx, dependingField;
2073for(idx=(i + 1); idx < rules.length; idx++){
2074dependingField=jQuery("#" + rules[idx]).first();
2075if(dependingField.length&&methods._required(dependingField, ["required"], 0, options, true)==undefined){
2076return methods._required(field, ["required"], 0, options);
2077}}
2078},
2079_submitButtonClick: function(event){
2080var button=$(this);
2081var form=button.closest('form, .validationEngineContainer');
2082form.data("jqv_submitButton", button.attr("id"));
2083}};
2084$.fn.validationEngine=function(method){
2085var form=$(this);
2086if(!form[0]) return form;
2087if(typeof(method)=='string'&&method.charAt(0)!='_'&&methods[method]){
2088if(method!="showPrompt"&&method!="hide"&&method!="hideAll")
2089methods.init.apply(form);
2090return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
2091}else if(typeof method=='object'||!method){
2092methods.init.apply(form, arguments);
2093return methods.attach.apply(form);
2094}else{
2095$.error('Method ' + method + ' does not exist in jQuery.validationEngine');
2096}};
2097$.validationEngine={fieldIdCounter: 0,defaults:{
2098validationEventTrigger: "blur",
2099scroll: true,
2100focusFirstField:true,
2101showPrompts: true,
2102validateNonVisibleFields: false,
2103ignoreFieldsWithClass: 'ignoreMe',
2104promptPosition: "topRight",
2105bindMethod:"bind",
2106inlineAjax: false,
2107ajaxFormValidation: false,
2108ajaxFormValidationURL: false,
2109ajaxFormValidationMethod: 'get',
2110onAjaxFormComplete: $.noop,
2111onBeforeAjaxFormValidation: $.noop,
2112onValidationComplete: false,
2113doNotShowAllErrosOnSubmit: false,
2114custom_error_messages:{},
2115binded: true,
2116notEmpty: false,
2117showArrow: true,
2118showArrowOnRadioAndCheckbox: false,
2119isError: false,
2120maxErrorsPerField: false,
2121ajaxValidCache: {},
2122autoPositionUpdate: false,
2123InvalidFields: [],
2124onFieldSuccess: false,
2125onFieldFailure: false,
2126onSuccess: false,
2127onFailure: false,
2128validateAttribute: "class",
2129addSuccessCssClassToField: "",
2130addFailureCssClassToField: "",
2131autoHidePrompt: false,
2132autoHideDelay: 10000,
2133fadeDuration: 300,
2134prettySelect: false,
2135addPromptClass:"",
2136usePrefix: "",
2137useSuffix: "",
2138showOneMessage: false
2139}};
2140$(function(){$.validationEngine.defaults.promptPosition=methods.isRTL()?'topLeft':"topRight"});
2141})(jQuery);
2142jQuery.cookie=function(name, value, options){
2143if(typeof value!='undefined'){
2144options=options||{};
2145if(value===null){
2146value='';
2147options=$.extend({}, options);
2148options.expires=-1;
2149}
2150var expires='';
2151if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){
2152var date;
2153if(typeof options.expires=='number'){
2154date=new Date();
2155date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
2156}else{
2157date=options.expires;
2158}
2159expires='; expires=' + date.toUTCString();
2160}
2161var path=options.path ? '; path=' + (options.path):'';
2162var domain=options.domain ? '; domain=' + (options.domain):'';
2163var secure=options.secure ? '; secure':'';
2164document.cookie=[name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
2165}else{
2166var cookieValue=null;
2167if(document.cookie&&document.cookie!=''){
2168var cookies=document.cookie.split(';');
2169for (var i=0; i < cookies.length; i++){
2170var cookie=jQuery.trim(cookies[i]);
2171if(cookie.substring(0, name.length + 1)==(name + '=')){
2172cookieValue=decodeURIComponent(cookie.substring(name.length + 1));
2173break;
2174}}
2175}
2176return cookieValue;
2177}};
2178jQuery.fn.pagination=function(maxentries, opts){
2179opts=jQuery.extend({
2180items_per_page: 10,
2181num_display_entries: 10,
2182current_page: 0,
2183num_edge_entries: 0,
2184link_to: "#",
2185prev_text: "Prev",
2186next_text: "Next",
2187ellipse_text: "...",
2188prev_show_always: true,
2189next_show_always: true,
2190callback: function(){
2191return false;
2192}}, opts||{});
2193return this.each(function(){
2194function numPages(){
2195return Math.ceil(maxentries / opts.items_per_page);
2196}
2197function getInterval(){
2198var ne_half=Math.ceil(opts.num_display_entries / 2);
2199var np=numPages();
2200var upper_limit=np - opts.num_display_entries;
2201var start=current_page > ne_half ? Math.max(Math.min(current_page - ne_half, upper_limit), 0):0;
2202var end=current_page > ne_half ? Math.min(current_page + ne_half, np):Math.min(opts.num_display_entries, np);
2203return [start, end];
2204}
2205function pageSelected(page_id, evt){
2206current_page=page_id;
2207drawLinks();
2208var continuePropagation=opts.callback(page_id, panel);
2209if(!continuePropagation){
2210if(evt.stopPropagation){
2211evt.stopPropagation();
2212}else{
2213evt.cancelBubble=true;
2214}}
2215return continuePropagation;
2216}
2217function drawLinks(){
2218panel.empty();
2219var interval=getInterval();
2220var np=numPages();
2221var getClickHandler=function(page_id){
2222return function(evt){
2223return pageSelected(page_id, evt);
2224}}
2225var appendItem=function(page_id, appendopts){
2226page_id=page_id < 0 ? 0:(page_id < np ? page_id:np - 1);
2227appendopts=jQuery.extend({text: page_id + 1, classes: ""}, appendopts||{});
2228if(page_id==current_page){
2229var lnk=jQuery("<span class='current'>" + (appendopts.text) + "</span>");
2230}else{
2231var lnk=jQuery("<a>" + (appendopts.text) + "</a>")
2232.bind("click", getClickHandler(page_id))
2233.attr('href', opts.link_to.replace(/__id__/, page_id));
2234}
2235if(appendopts.classes){
2236lnk.addClass(appendopts.classes);
2237}
2238panel.append(lnk);
2239}
2240if(opts.prev_text&&(current_page > 0||opts.prev_show_always)){
2241appendItem(current_page - 1, {text: opts.prev_text, classes: "prev"});
2242}
2243if(interval[0] > 0&&opts.num_edge_entries > 0){
2244var end=Math.min(opts.num_edge_entries, interval[0]);
2245for (var i=0; i < end; i++){
2246appendItem(i);
2247}
2248if(opts.num_edge_entries < interval[0]&&opts.ellipse_text){
2249jQuery("<span>" + opts.ellipse_text + "</span>").appendTo(panel);
2250}}
2251for (var i=interval[0]; i < interval[1]; i++){
2252appendItem(i);
2253}
2254if(interval[1] < np&&opts.num_edge_entries > 0){
2255if(np - opts.num_edge_entries > interval[1]&&opts.ellipse_text){
2256jQuery("<span>" + opts.ellipse_text + "</span>").appendTo(panel);
2257}
2258var begin=Math.max(np - opts.num_edge_entries, interval[1]);
2259for (var i=begin; i < np; i++){
2260appendItem(i);
2261}}
2262if(opts.next_text&&(current_page < np - 1||opts.next_show_always)){
2263appendItem(current_page + 1, {text: opts.next_text, classes: "next"});
2264}}
2265var current_page=opts.current_page;
2266maxentries=(!maxentries||maxentries < 0) ? 1:maxentries;
2267opts.items_per_page=(!opts.items_per_page||opts.items_per_page < 0) ? 1:opts.items_per_page;
2268var panel=jQuery(this);
2269this.selectPage=function(page_id){
2270pageSelected(page_id);
2271}
2272this.prevPage=function(){
2273if(current_page > 0){
2274pageSelected(current_page - 1);
2275return true;
2276}else{
2277return false;
2278}}
2279this.nextPage=function(){
2280if(current_page < numPages() - 1){
2281pageSelected(current_page + 1);
2282return true;
2283}else{
2284return false;
2285}}
2286drawLinks();
2287opts.callback(current_page, this);
2288});
2289};
2290jQuery(function($){
2291$('a.bbp-topic-trash-link').click(function(event){
2292if(! confirm('Are you sure you want to delete this topic?')){
2293event.preventDefault();
2294}});
2295});jQuery(function($){
2296$('a.bbp-reply-trash-link').click(function(event){
2297if(! confirm('Are you sure you want to delete this reply?')){
2298event.preventDefault();
2299}});
2300});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.