Index: branches/RC/core/admin_templates/js/ajax_dropdown.js
===================================================================
diff -u
--- branches/RC/core/admin_templates/js/ajax_dropdown.js (revision 0)
+++ branches/RC/core/admin_templates/js/ajax_dropdown.js (revision 9276)
@@ -0,0 +1,269 @@
+/*
+(c) Intechnic Europe 2007 http://www.intechnic.lv
+Author: Konstantin Tjuterev
+
+The class adds a dynamic drop-down to the edit-box
+Usage:
+
+
+
+
+
+The AJAXDropDown constructor takes the following arguments:
+ input_id - id of textbox to attach to
+ suggest_url_callback - function which should return URL which returns XML of suggested values,
+ function takes one argument - it is current value of the text_box
+ [get_value_callback] - optional argument - function which returns the value to be set in the textbox,
+ based on currently selected item (out of suggested). If the argument is skipped - the node value of
+ element will be used as the value
+ element in the suggestions XML may have unlimited number of attribuets, all the attributes will be set
+ to the corresponding DIV element and this DIV element will be passed as argument to the get_value_callback,
+ so one may use the argument to alter the value set into textbox as in the example above
+
+Response XML structure:
+ The script will look for ALL elements with tagname = 'item', so basically the structure should look like this:
+
+
+ Suggestion 1
+ Suggestion 2
+ Suggestion 3
+
+
+Design & CSS
+ The script will automatically display a div which width will match the width of the text-box
+ You may control the div look by changing .suggest-box CSS selector
+ The items inside the box will have .suggest-item and .suggest-item-over
+
+ The default styles which may be used is:
+
+
+
+*/
+
+
+function AJAXDropDown(input_id, suggest_url_callback, get_value_callback)
+{
+ this.Input = document.getElementById(input_id);
+ this.KeyUpWaiting = false;
+ this.KeyUpTimer = false;
+ this.Box = '';
+ this.SuggestURLCallback = suggest_url_callback;
+ if (!get_value_callback) get_value_callback = this.GetValue;
+ this.GetValueCallback = get_value_callback;
+ this.BoxOpen = false;
+ this.SelectedItem = false;
+ var obj = this;
+ addLoadEvent(function() {obj.Init()});
+}
+
+AJAXDropDown.prototype.Init = function()
+{
+ // draw box
+ this.Box = document.createElement('DIV');
+ document.body.appendChild(this.Box);
+
+// this.Box = addElement(this.Input.parentNode, 'div');
+ this.Box.style.display = 'none';
+ this.Box.style.zIndex = 99;
+ this.Box.style.position = 'absolute';
+ this.Box.style.overflow = 'auto';
+ this.Box.className = 'suggest-box'
+
+ // add onkeyup
+ var obj = this;
+ addEvent(this.Input, 'keyup', function(ev) {obj.KeyUp(ev)})
+ addEvent(this.Input, 'blur', function(ev) {obj.Blur(ev)})
+ addEvent(this.Box, 'scroll', function(ev) {if (obj.BlurWaiting) {window.clearTimeout(obj.BlurTimer);}});
+ addEvent(this.Box, 'mouseup', function(ev) {obj.BlurWaiting = false});
+}
+
+AJAXDropDown.prototype.Blur = function(ev)
+{
+ if (this.BlurWaiting) return;
+ this.BlurWaiting = true;
+ var obj = this;
+ this.BlurTimer = window.setTimeout(function() {
+ obj.CloseBox();
+ this.BlurWaiting = false;
+ }, 300)
+}
+
+AJAXDropDown.prototype.KeyUp = function(ev)
+{
+ var e = !is.ie ? ev : window.event;
+ switch (e.keyCode) {
+ case 38: //arrow up
+ if (!this.BoxOpen) break;
+ this.SelectPrev();
+ break;
+ case 40: //arrow down
+ if (!this.BoxOpen) break;
+ this.SelectNext();
+ break;
+ case 27: //arrow down
+ this.Input.value = this.OriginalValue;
+ this.CloseBox();
+ break;
+ case 13: //arrow down
+ this.CloseBox();
+ break;
+ default:
+ if (this.Input.value == '') return;
+ var obj = this;
+ if (this.KeyUpWaiting && this.KeyUpTimer) {
+ window.clearTimeout(this.KeyUpTimer);
+ this.KeyUpTimer = false;
+ }
+ this.KeyUpWaiting = true;
+ this.KeyUpTimer = window.setTimeout(function() {
+ obj.RequestSuggestions();
+ }, 300)
+ }
+}
+
+AJAXDropDown.prototype.RequestSuggestions = function()
+{
+ Request.makeRequest(this.SuggestURLCallback(this.Input.value), false, '', this.successCallback, this.errorCallback, 'reload', this);
+}
+
+AJAXDropDown.prototype.successCallback = function (request, params, object) {
+ object.OriginalValue = object.Input.value;
+ object.OpenBox();
+ object.KeyUpWaiting = false;
+ var items = request.responseXML.getElementsByTagName('item');
+ object.ClearItems();
+ for (var i=0; i=0; i--)
+ {
+ this.Box.removeChild(this.Box.childNodes[i]);
+ }
+}
+
+AJAXDropDown.prototype.OpenBox = function()
+{
+ var pos = findPos(this.Input);
+ var dim = getDimensions(this.Input);
+ this.Box.style.left = pos[0] + 'px';
+ this.Box.style.top = (pos[1] + dim.innerHeight + dim.borders[0] + dim.borders[2]) + 'px';
+ this.Box.style.width = (dim.innerWidth + dim.borders[1] + (is.ie ? dim.borders[3] : 0 ) ) + 'px';
+ this.Box.style.display = 'block';
+// alert('box opened at '+this.Box.style.left+','+this.Box.style.top+' pos x:'+pos[0])
+ this.BoxOpen = true;
+}
+
+AJAXDropDown.prototype.CloseBox = function()
+{
+ if (!this.BoxOpen) return;
+ this.Box.style.display = 'none';
+ this.BoxOpen = false;
+}
+
+AJAXDropDown.prototype.AddItem = function(value, attributes)
+{
+ var item = addElement(this.Box, 'div');
+ for (var i=0; i