import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / js / list.js
1 /* by TKirby, released under GPL */
2 /* Define the "list" Class */
3 Class("list").define({
4  name : null,
5  xml  : null,
6  sels : null,
7  list : function (src, esrc, name) { this.init(src, esrc, name); },
8  read : function () {
9      var i              = 0;
10      if(this.xml.readyState!=4) { setTimeout(this.name+".read()", 100); }
11      else if(this.xml.status!=200) alert("Document not available.");
12      else {
13          var doc        = this.xml.responseXML;
14          var nNode      = null;
15          if(doc.childNodes[0].nodeName=="parseerror") alert("Parse Error.");
16          doc            = doc.getElementsByTagName("list")[0];
17          for(i=0;i<doc.childNodes.length;i++) {
18              if(doc.childNodes[i].childNodes.length>0) {
19                  nNode  = document.createElement("option");
20                  nNode.appendChild(document.createTextNode(doc.childNodes[i].childNodes[0].nodeValue));
21                  this.sels[0].appendChild(nNode);
22              }
23          }
24      }
25  },
26      
27  init : function (src,esrc,name) {
28      if(!src) return;
29      this.name          = name;
30      this.sels          = new Array();
31      var i                      = 0;
32      for(i=0;i<src.childNodes.length;i++) {
33          if(src.childNodes[i].nodeName=="select" || src.childNodes[i].nodeName=="SELECT") {
34              this.sels.push(src.childNodes[i]);
35          } 
36
37          if((src.childNodes[i].nodeName=="input" || src.childNodes[i].nodeName=="INPUT")
38             && (src.childNodes[i].name=="fromjs")) {
39              src.childNodes[i].value = 1;
40          }
41
42          if((src.childNodes[i].nodeName=="input" || src.childNodes[i].nodeName=="INPUT")
43             && (src.childNodes[i].type=="submit" || src.childNodes[i].type=="SUBMIT")) {
44
45              if (src.childNodes[i].name.indexOf("Save") < 0) {
46                  var tmp        = document.createElement("input");
47                  tmp.type       = "button";
48                  tmp.name       = src.childNodes[i].name;
49                  tmp.value      = src.childNodes[i].value;
50                  src.replaceChild(tmp,src.childNodes[i]);
51              }
52
53              if(src.childNodes[i].name=="add")
54                  src.childNodes[i].onclick = new Function(this.name+".add();");
55              if(src.childNodes[i].name=="remove") 
56                  src.childNodes[i].onclick = new Function(this.name+".remove();");
57              if(src.childNodes[i].name=="moveup") 
58                  src.childNodes[i].onclick = new Function(this.name+".moveup();");
59              if(src.childNodes[i].name=="movedown") 
60                  src.childNodes[i].onclick = new Function(this.name+".movedown();");
61          } 
62      }
63      if (esrc) {
64          this.xml       = (window.navigator.appName!="Microsoft Internet Explorer"
65                            ?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"));
66          this.xml.open("GET", esrc);
67          this.xml.send("");
68          setTimeout(this.name+".read()", 100);
69      }
70  },
71      
72  add : function() {
73      var i, j   = 0;
74      var dNode  = null;
75      for(i=0;i<this.sels[0].length;i++) if(this.sels[0][i].selected) {
76          for(j=0;j<this.sels[1].length;j++) if(this.sels[1][j].value==this.sels[0][i].value) break;
77          if(j==this.sels[1].length) dNode       = this.sels[0][i].cloneNode(true), 
78                                         this.sels[1].appendChild(dNode);
79      }
80  },
81
82  moveup : function() { this.move(-1); },
83  movedown : function() { this.move(1); },
84  move : function(v) {
85   var i         = 0;
86   if(v<0) for(i=0;i<this.sels[1].length;i++) this.moveOne(v, i);
87   else if(v>0) for(i=this.sels[1].length-1;i>=0;i--)this.moveOne(v, i);
88  },
89
90  moveOne : function(v, i) {
91   var ins       = v + i;
92   if(ins<0 || ins>=this.sels[1].length) return;
93   if(this.sels[1][ins].selected) return;
94   if(this.sels[1][i].selected) {
95    Node         = this.sels[1][i];
96    this.sels[1].removeChild(Node);
97    this.sels[1].insertBefore(Node, this.sels[1][ins]);
98   }
99  },
100
101  remove : function() {
102   var i         = 0;
103   for(i=this.sels[1].length-1;i>=0;i--) if(this.sels[1][i].selected) 
104    this.sels[1].removeChild(this.sels[1][i]);
105  },
106
107  selectAll: function() {
108   var i         = 0;
109   for(i=0;i<this.sels[0].length;i++) this.sels[0][i].selected = false;
110   for(i=0;i<this.sels[1].length;i++) this.sels[1][i].selected = true;
111  }
112 });