Added javascript add-on for unobtrusive apply handlers to html inputs
[fa-stable.git] / js / inserts.js
1 //ajax transfer progress indicator
2 var starttabs = new Array();
3 var autoload = new Array();
4 var onload_script = ""
5 var loadstatustext="<img src='js/images/progressbar1.gif' /> Requesting content..."
6 var loadedobjects=""
7
8 function Querystring(qs) { // optionally pass a querystring to parse
9         this.params = new Object() 
10         this.get=Querystring_get
11         this.set=Querystring_set
12         this.href=window.location.pathname 
13         this.url=Querystring_url
14         
15         if (qs == null)
16                 qs=location.search.substring(1,location.search.length)
17
18         if (qs.length == 0) return
19
20 // Turn <plus> back to <space>
21 // See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
22         qs = qs.replace(/\+/g, ' ')
23         var args = qs.split('&') // parse out name/value pairs separated via &
24         
25 // split out each name=value pair
26         for (var i=0;i<args.length;i++) {
27                 var value;
28                 var pair = args[i].split('=')
29                 var name = unescape(pair[0])
30
31                 if (pair.length == 2)
32                         value = unescape(pair[1])
33                 else
34                         value = name
35                 
36                 this.params[name] = value
37         }
38         
39         this.page = this.params.page
40         delete this.params.page
41 }
42
43 function Querystring_get(key, default_) {
44         // This silly looking line changes UNDEFINED to NULL
45         if (default_ == null) default_ = null;
46         
47         var value=this.params[key]
48         if (value==null) value=default_;
49         
50         return value
51 }
52
53 function Querystring_set(key, value) {
54         this.params[key] = value;
55 }
56
57 function Querystring_url() {
58  var url = this.href + '?page='+ this.page
59  for( key in this.params) {
60         url += '&'+ key + '='+ this.params[key]
61  }
62  return url
63 }
64
65 function debug(msg) {
66 //alert(msg)
67 document.getElementById('debug').innerHTML=msg
68 }
69
70 function        ajaxloader(url,vars,div) {
71                 var container = document.getElementById(div)
72                 var callback=function(response,headers,context) {
73                  container.innerHTML=response;
74                  Behaviour.apply();
75                 }
76  debug(url)
77                 container.innerHTML=loadstatustext
78                 ajaxCaller.postForPlainText(url,vars,callback)
79 }
80
81 function loadobjs(revattribute){
82 if (revattribute!=null && revattribute!=""){ //if "rev" attribute is defined (load external .js or .css files)
83 var objectlist=revattribute.split(/\s*,\s*/) //split the files and store as array
84 for (var i=0; i<objectlist.length; i++){
85 var file=objectlist[i]
86 var fileref=""
87 if (loadedobjects.indexOf(file)==-1){ //Check to see if this object has not already been added to page before proceeding
88 if (file.indexOf(".js")!=-1){ //If object is a js file
89 fileref=document.createElement('script')
90 fileref.setAttribute("type","text/javascript");
91 fileref.setAttribute("src", file);
92 }
93 else if (file.indexOf(".css")!=-1){ //If object is a css file
94 fileref=document.createElement("link")
95 fileref.setAttribute("rel", "stylesheet");
96 fileref.setAttribute("type", "text/css");
97 fileref.setAttribute("href", file);
98 }
99 }
100 if (fileref!=""){
101 document.getElementsByTagName("head").item(0).appendChild(fileref)
102 loadedobjects+=file+" " //Remember this object as being already added to page
103 }
104 }
105 }
106 }
107
108 function _expand(tabobj) {
109 var alltabs=tabobj.parentNode.parentNode.getElementsByTagName("a")
110
111 if (tabobj.getAttribute("rel")){
112 for (var i=0; i<alltabs.length; i++){
113 alltabs[i].className= "other"  //deselect all tabs
114 }
115 tabobj.className="current"
116 ajaxloader(tabobj.getAttribute("href"), {}, tabobj.getAttribute("rel"))
117 //loadobjs(tabobj.getAttribute("rev"))
118 }
119 }
120
121 function expandtab(tabcontentid, tabnumber){ //interface for selecting a tab (plus expand corresponding content)
122 var alltabs=document.getElementById(tabcontentid).getElementsByTagName("a")
123 var thetab=alltabs[tabnumber]
124 //debug(tabcontentid+' '+tabnumber)
125 if (thetab.getAttribute("rel")){
126  for (var i=0; i<alltabs.length; i++){
127 alltabs[i].className= i==tabnumber?"current":"other"  //deselect all tabs
128 }
129 ajaxloader(thetab.getAttribute("href"), {}, thetab.getAttribute("rel"))
130 loadobjs(thetab.getAttribute("rev"))
131
132 }
133 }
134
135 //---------------------
136 function _setlink(element){
137 if (element.getAttribute("rel")){
138 var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
139 modifiedurl +="&ajax="+element.getAttribute('id');
140 //debug(modifiedurl)
141 element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
142 element.onclick=function(){
143 ajaxloader(this.getAttribute("href"), {}, this.getAttribute("rel"))
144 loadobjs(this.getAttribute("rev"))
145 return false
146 }
147 }
148 }
149
150 function _settabs(tab) {
151 var ulist=tab.getElementsByTagName("li") //array containing the LI elements within UL
152 for (var x=0; x<ulist.length; x++){ //loop through each LI element
153 var ulistlink=ulist[x].getElementsByTagName("a")[0]
154 //if (ulistlink.getAttribute("rel"))
155 if(ulistlink.onclick==undefined)          {
156 var modifiedurl=ulistlink.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
157 modifiedurl += "&ajax="+ulistlink.getAttribute('id');
158 ulistlink.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
159
160 ulistlink.onclick=function(){
161 _expand(this);
162 return false
163 }
164 if (ulistlink.className=="current"){
165 starttabs.push(ulistlink)
166 }
167 }
168 }
169 }
170
171 function _TableRowSelector(table,row) {
172                  var sels = table.getAttribute('selector').split(',') // tablica selektorów
173                  var cols = table.getElementsByTagName('th') //identyfikatory kolumn
174                  var colvals = row.getElementsByTagName("td")
175                  selector =''
176                  for(s=0; s<sels.length; s++) {
177                                 selector += '&' + sels[s] + '='
178                   for(c=0; c<cols.length; c++) {
179                          if(cols[c].getAttribute('id')==sels[s]) {
180                                 selector += colvals[c].innerHTML
181                                 break;          
182                    }
183                         }
184                  }
185                  return selector;
186 }
187 /*
188  Ajax elements behaviour definitions
189 */
190 var inserts = {
191         'div.ajax-component': function(element) { // automatic ajax component init
192          if(element.innerHTML=='') {
193                 autoload.push(element.id)
194          }
195         },
196         
197   'form.ajaxform': function(element) {
198                 element.onsubmit=function(){
199                  var url=element.action;
200                  var div=element.getAttribute("rel")
201                  var submit
202                  var Query = new Querystring();
203
204 //                url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
205 //               url=window.location
206                   var vars = new Array();
207                         for(i=0; i<element.length; i++) {
208                          vars[element.elements[i].name]=element.elements[i].value;
209                          if(element.elements[i].name=='submit') 
210                                 submit=element.elements[i].id // obsolete
211                         }
212                  Query.set('ajax', element.id);
213                  Query.set('action', 'update');
214                  ajaxloader(Query.url(),vars, div)
215                 }
216
217                 element.onreset=function(){
218                  var url=element.action;
219                  var div=element.getAttribute("rel")
220                   url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
221                   url = url + "&ajax=" + element.id + "&action=reset";
222 //                var vars = new Array();
223 //                      for(i=0; i<element.length; i++) {
224 //                       vars[element.elements[i].name]=element.elements[i].value;
225 //                      }
226                         var vars = {}
227                         ajaxloader(url,vars, div)
228                 }
229                 return false;
230          },
231
232         'a.ajaxlink': function(element) {
233         // if onclick is defined this element is initialized
234                   if(element.onclick==undefined) _setlink(element);
235          },
236
237   'ul.ajaxtabs': function(element) {
238                 _settabs(element)
239          },
240
241         'table.ajaxgrid': function(element) {
242                 var rows = element.getElementsByTagName('tr')
243                 for(i=1;i<rows.length-1; i++) {
244                 rows[i].onmouseover=function() {this.className='row2' }
245                 rows[i].onmouseout=function() {this.className='row1' }
246                 rows[i].ondblclick=function() {
247                  var table = this.parentNode.parentNode
248                  var url = table.getAttribute('editor')
249                  var vars = {}
250                  url += '&action=select'
251                  url += _TableRowSelector(table,this)
252
253                  if( table.getAttribute('editor').indexOf('ajax=')>-1) {
254                         ajaxloader(url,vars, table.getAttribute('rel'))
255                  } else { // this is external 'select' handler
256                         window.location = url;
257                  }
258
259                 }
260          }
261         },
262   'table.ajaxgrid th':   function(element) {
263                 element.onclick=function(){
264                  var table = this.parentNode.parentNode.parentNode
265                  var url = table.getAttribute('href')
266                  var vars = {}
267                  url+='&ajax='+table.id+'&action=sort&id='+ this.id
268 // debug(url)
269
270                  ajaxloader(url, {}, table.getAttribute("rel"))
271 //               loadobjs(this.getAttribute("href"))
272                  return false
273          }
274         },
275         'a.ajaxgrid-navi': function(element) {
276   if(element.onclick==undefined)
277          if (element.getAttribute("rel")){
278                 var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
279                 element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
280           if( modifiedurl.indexOf('ajax=')>-1) {
281                  element.onclick=function(){ // set ajax handler 
282 // debug(this.getAttribute("href"))
283                   ajaxloader(this.getAttribute("href"), {}, this.getAttribute("rel"))
284                   loadobjs(this.getAttribute("href"))
285                   return false
286                  }
287           }
288          }
289         },
290   'a.ajaxgrid-select':   function(element) {
291          if(element.onclick==undefined) {
292                 var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
293                 element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
294                 element.onclick=function(){
295                  var row = this.parentNode.parentNode
296                  var table = row.parentNode.parentNode
297
298                  var url = this.getAttribute('href')
299                  var vars = {}
300
301                  hideddrivetip() 
302
303 //               url += '&ajax='+table.id
304                  url += _TableRowSelector(table,row)
305 //       alert( this.getAttribute('rel'))
306                  ajaxloader(url,vars, this.getAttribute('rel'))
307                  return false
308                 }
309           element.tooltip = element.getAttribute('title') // save tooltip
310                 element.removeAttribute('title') // native tooltip off
311                 element.onmouseover=function() {
312                  ddrivetip(this.tooltip)
313                 }
314           element.onmouseout=function() { 
315                  hideddrivetip() 
316                 }
317          }
318         },
319   '.amount': function(element) {
320                 if(element.onblur==undefined) {
321                   var dec = element.getAttribute("dec");
322                   element.onblur = function() {
323                         price_format(this.name, get_amount(this.name), dec);
324                   };
325                 }
326         }
327 };
328
329 Behaviour.register(inserts);
330 // open selected tabs on load
331 Behaviour.addLoadEvent(function() {
332 for(i=0; i<starttabs.length; i++) {
333 _expand(starttabs[i]);
334 }
335 }
336 );
337
338 Behaviour.addLoadEvent(function() {
339 for(i=0; i<autoload.length; i++) {
340         var vars = {}
341          var Query = new Querystring();
342          Query.set('ajax', autoload[i]);
343          delete Query.params.action
344 //alert(Query.url())
345          ajaxloader(Query.url(), {}, autoload[i]);
346 }
347 }
348 );