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.