// Interface patches //Autocomplete patch //Adds support for JSON data retrieval. jQuery.iAuto = { helper : null, content : null, iframe: null, timer : null, lastValue: null, currentValue: null, subject: null, selectedItem : null, items: null, empty : function() { jQuery.iAuto.content.empty(); if (jQuery.iAuto.iframe) { jQuery.iAuto.iframe.hide(); } }, clear : function() { if (jQuery.iAuto.subject) { jQuery.iAuto.items = null; jQuery.iAuto.selectedItem = null; jQuery.iAuto.lastValue = jQuery.iAuto.subject.value; if(jQuery.iAuto.helper.css('display') == 'block') { if (jQuery.iAuto.subject.autoCFG.fx) { switch(jQuery.iAuto.subject.autoCFG.fx.type) { case 'fade': jQuery.iAuto.helper.fadeOut(jQuery.iAuto.subject.autoCFG.fx.duration, jQuery.iAuto.empty); break; case 'slide': jQuery.iAuto.helper.SlideOutUp(jQuery.iAuto.subject.autoCFG.fx.duration, jQuery.iAuto.empty); break; case 'blind': jQuery.iAuto.helper.BlindUp(jQuery.iAuto.subject.autoCFG.fx.duration, jQuery.iAuto.empty); break; } } else { jQuery.iAuto.helper.hide(); } if (jQuery.iAuto.subject.autoCFG.onHide) jQuery.iAuto.subject.autoCFG.onHide.apply(jQuery.iAuto.subject, [jQuery.iAuto.helper, jQuery.iAuto.iframe]); } else { jQuery.iAuto.empty(); } } window.clearTimeout(jQuery.iAuto.timer); }, update : function () { var subject = jQuery.iAuto.subject; var subjectValue = jQuery.iAuto.getFieldValues(subject); var dataSource = subject.autoCFG.source; var dataSourceType = subject.autoCFG.dataSourceType; var isXML = subject.autoCFG.isXML; if (subject && subjectValue.item != jQuery.iAuto.lastValue && subjectValue.item.length >= subject.autoCFG.minchars) { jQuery.iAuto.lastValue = subjectValue.item; jQuery.iAuto.currentValue = subjectValue.item; data = { field: jQuery(subject).attr('name')||'field', value: subjectValue.item }; if (typeof dataSource == 'string') { jQuery.ajax( { type: 'POST', data: jQuery.param(data), dataType: (isXML) ? 'xml' : 'json', success: function(response) { jQuery.iAuto.handleData(response, subject, subjectValue, isXML); }, url : dataSource } ); } else if(typeof dataSource == 'function') { var returnedData = dataSource(data); jQuery.iAuto.handleData(returnedData, subject, subjectValue, isXML); } } }, writeItems : function(subject, toWrite) { jQuery.iAuto.content.html(toWrite); jQuery.iAuto.items = jQuery('li', jQuery.iAuto.content.get(0)); jQuery.iAuto.items .mouseover(jQuery.iAuto.hoverItem) .bind('click', jQuery.iAuto.clickItem); var position = jQuery.iUtil.getPosition(subject); var size = jQuery.iUtil.getSize(subject); jQuery.iAuto.helper .css('top', position.y + size.hb + 'px') .css('left', position.x + 'px') .addClass(subject.autoCFG.helperClass); if (jQuery.iAuto.iframe) { jQuery.iAuto.iframe .css('display', 'block') .css('top', position.y + size.hb + 'px') .css('left', position.x + 'px') .css('width', jQuery.iAuto.helper.css('width')) .css('height', jQuery.iAuto.helper.css('height')); } jQuery.iAuto.selectedItem = 0; jQuery.iAuto.items.get(0).className = subject.autoCFG.selectClass; jQuery.iAuto.applyOn(subject,subject.autoCFG.lastSuggestion[0], 'onHighlight'); if (jQuery.iAuto.helper.css('display') == 'none') { if (subject.autoCFG.inputWidth) { var borders = jQuery.iUtil.getPadding(subject, true); var paddings = jQuery.iUtil.getBorder(subject, true); jQuery.iAuto.helper.css('width', subject.offsetWidth - (jQuery.boxModel ? (borders.l + borders.r + paddings.l + paddings.r) : 0 ) + 'px'); } if (subject.autoCFG.fx) { switch(subject.autoCFG.fx.type) { case 'fade': jQuery.iAuto.helper.fadeIn(subject.autoCFG.fx.duration); break; case 'slide': jQuery.iAuto.helper.SlideInUp(subject.autoCFG.fx.duration); break; case 'blind': jQuery.iAuto.helper.BlindDown(subject.autoCFG.fx.duration); break; } } else { jQuery.iAuto.helper.show(); } if (jQuery.iAuto.subject.autoCFG.onShow) jQuery.iAuto.subject.autoCFG.onShow.apply(jQuery.iAuto.subject, [jQuery.iAuto.helper, jQuery.iAuto.iframe]); } }, checkCache : function() { var subject = this; if (subject.autoCFG.lastSuggestion) { jQuery.iAuto.lastValue = subject.value; jQuery.iAuto.currentValue = subject.value; var isXML = subject.autoCFG.isXML; var iterator = function(nr) { var value, text, testValue; if (isXML) { value = jQuery('value', this).text(); text = jQuery('text', this).text(); } else { value = this.value; text = this.text; } testValue = value.toLowerCase(); inputValue = subject.value.toLowerCase(); if (testValue.indexOf(inputValue) == 0) { toWrite += '
  • ' + text + '
  • '; } }; var toWrite = ''; if (isXML) { subject.autoCFG.lastSuggestion.each(iterator); } else { jQuery.each(subject.autoCFG.lastSuggestion, iterator); } if (toWrite != '') { jQuery.iAuto.writeItems(subject, toWrite); this.autoCFG.inCache = true; return; } } subject.autoCFG.lastSuggestion = null; this.autoCFG.inCache = false; }, selection : function(field, start, end) { if (field.createTextRange) { var selRange = field.createTextRange(); selRange.collapse(true); selRange.moveStart("character", start); selRange.moveEnd("character", - end + start); selRange.select(); } else if (field.setSelectionRange) { field.setSelectionRange(start, end); } else { if (field.selectionStart) { field.selectionStart = start; field.selectionEnd = end; } } field.focus(); }, getSelectionStart : function(field) { if (field.selectionStart) return field.selectionStart; else if(field.createTextRange) { var selRange = document.selection.createRange(); var selRange2 = selRange.duplicate(); return 0 - selRange2.moveStart('character', -100000); //result.end = result.start + range.text.length; /*var selRange = document.selection.createRange(); var isCollapsed = selRange.compareEndPoints("StartToEnd", selRange) == 0; if (!isCollapsed) selRange.collapse(true); var bookmark = selRange.getBookmark(); return bookmark.charCodeAt(2) - 2;*/ } }, getFieldValues : function(field) { var fieldData = { value: field.value, pre: '', post: '', item: '' }; if(field.autoCFG.multiple) { var finishedPre = false; var selectionStart = jQuery.iAuto.getSelectionStart(field)||0; var chunks = fieldData.value.split(field.autoCFG.multipleSeparator); for (var i=0; i= selectionStart || selectionStart == 0) && !finishedPre ) { if (fieldData.pre.length <= selectionStart) fieldData.item = chunks[i]; else fieldData.post += chunks[i] + (chunks[i] != '' ? field.autoCFG.multipleSeparator : ''); finishedPre = true; } else if (finishedPre){ fieldData.post += chunks[i] + (chunks[i] != '' ? field.autoCFG.multipleSeparator : ''); } if(!finishedPre) { fieldData.pre += chunks[i] + (chunks.length > 1 ? field.autoCFG.multipleSeparator : ''); } } } else { fieldData.item = fieldData.value; } return fieldData; }, autocomplete : function(e) { window.clearTimeout(jQuery.iAuto.timer); var subject = jQuery.iAuto.getFieldValues(this); var pressedKey = e.charCode || e.keyCode || -1; if (/13|27|35|36|38|40|9/.test(pressedKey) && jQuery.iAuto.items) { if (window.event) { window.event.cancelBubble = true; window.event.returnValue = false; } else { e.preventDefault(); e.stopPropagation(); } if (jQuery.iAuto.selectedItem != null) jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0).className = ''; else jQuery.iAuto.selectedItem = -1; switch(pressedKey) { //enter case 9: case 13: if (jQuery.iAuto.selectedItem == -1) jQuery.iAuto.selectedItem = 0; var selectedItem = jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0); var valueToAdd = selectedItem.getAttribute('rel'); this.value = subject.pre + valueToAdd + this.autoCFG.multipleSeparator + subject.post; jQuery.iAuto.lastValue = subject.item; jQuery.iAuto.selection( this, subject.pre.length + valueToAdd.length + this.autoCFG.multipleSeparator.length, subject.pre.length + valueToAdd.length + this.autoCFG.multipleSeparator.length ); jQuery.iAuto.clear(); if (this.autoCFG.onSelect) { iteration = parseInt(selectedItem.getAttribute('dir'))||0; jQuery.iAuto.applyOn(this,this.autoCFG.lastSuggestion[iteration], 'onSelect'); } if (this.scrollIntoView) this.scrollIntoView(false); return pressedKey != 13; break; //escape case 27: this.value = subject.pre + jQuery.iAuto.lastValue + this.autoCFG.multipleSeparator + subject.post; this.autoCFG.lastSuggestion = null; jQuery.iAuto.clear(); if (this.scrollIntoView) this.scrollIntoView(false); return false; break; //end case 35: jQuery.iAuto.selectedItem = jQuery.iAuto.items.size() - 1; break; //home case 36: jQuery.iAuto.selectedItem = 0; break; //up case 38: jQuery.iAuto.selectedItem --; if (jQuery.iAuto.selectedItem < 0) jQuery.iAuto.selectedItem = jQuery.iAuto.items.size() - 1; break; case 40: jQuery.iAuto.selectedItem ++; if (jQuery.iAuto.selectedItem == jQuery.iAuto.items.size()) jQuery.iAuto.selectedItem = 0; break; } jQuery.iAuto.applyOn(this,this.autoCFG.lastSuggestion[jQuery.iAuto.selectedItem||0], 'onHighlight'); jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0).className = this.autoCFG.selectClass; if (jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0).scrollIntoView) jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0).scrollIntoView(false); if(this.autoCFG.autofill) { var valToAdd = jQuery.iAuto.items.get(jQuery.iAuto.selectedItem||0).getAttribute('rel'); this.value = subject.pre + valToAdd + this.autoCFG.multipleSeparator + subject.post; if(jQuery.iAuto.lastValue.length != valToAdd.length) jQuery.iAuto.selection( this, subject.pre.length + jQuery.iAuto.lastValue.length, subject.pre.length + valToAdd.length ); } return false; } jQuery.iAuto.checkCache.apply(this); if (this.autoCFG.inCache == false) { if (subject.item != jQuery.iAuto.lastValue && subject.item.length >= this.autoCFG.minchars) jQuery.iAuto.timer = window.setTimeout(jQuery.iAuto.update, this.autoCFG.delay); if (jQuery.iAuto.items) { jQuery.iAuto.clear(); } } return true; }, applyOn: function(field, item, type) { var dataSource = field.autoCFG.source; if (field.autoCFG[type]) { var data = {}; if (field.autoCFG.isXML) { childs = item.getElementsByTagName('*'); for(i=0; i