// DynoForms -- dynamic forms for Dot Net Nuke
// (C) 2006 John Hanna for Uncommon Solutions

var DynoForms;
var Json;
var DFO;
if(! DFO ) DFO={};

if (!window.XMLHttpRequest) {
    window.XMLHttpRequest = function()     {
        var types = [
                'Microsoft.XMLHTTP',
                'MSXML2.XMLHTTP.5.0',
                'MSXML2.XMLHTTP.4.0',
                'MSXML2.XMLHTTP.3.0',
                'MSXML2.XMLHTTP'
                ];
        for (var i = 0; i < types.length; i++) {
            try { return new ActiveXObject(types[i]); } catch(e) {}
        }
        return undefined;
    }
}

function setAjax(a) { Json=a }

function DynoForm(form, action, control,parent) {
 // load a form into the control
 if(! DynoForms) DynoForms={};
 if(control) {
  var mid=control.replace(/DynoForms_/,'');
  DynoForms[form]={'control':$(control),'moduleid':mid,'style':'','acolor':'#f0f0f8'};
  if(parent) DynoForms[form].parent=DynoForms[parent];
 }
 dojs(form, action); // calls back to DynoFormShow
}

function DynoFormSelect(form,id) {
 DynoForm(id,'listbox',id,form);
}

function dojs(form, action) {
 var m;
 m = '_object=' + form + '&_action=' + action;// + '&_nocache=' + (Math.random()+'').substring(8);
 if(DynoForms[form]) {
  var df=DynoForms[form];
  if(df.r) {
   var p=df.r.parms.split(";").sort(function(a,b){return b.length-a.length}).join(';');
   p=p.replace(/([^;\s][^;]*)/g,"m+=DynoFormsParm('$1',form)");
   eval(p);
  }
  if(df.parent && df.parent.r && df.parent.r.parms) {
   // the parameters have to be in order descending by length so that longer ones are substituted before shorter ones.
   var parent=df.parent;
   var p=parent.r.parms.replace(/\s/g,'').split(";");
   p=p.sort(function(a,b){return b.length-a.length});
   p=p.join(';');
   if(df.control.type=='select-one') {
    // for the select boxes -- add the parms of the parent
    if(parent.r.result) {
     p=p.replace(/([^;\s][^;]*)/g," m+='&$1='+encodeURIComponent(parent.r.result.$1)");
    } else {
     p='';
    }
   } else {
    // for the subforms
    var fp=parent.r.object;
    p=p.replace(/([^;\s][^;]*)/g,"m+=DynoFormsParm('$1',fp)");
   }
   eval(p);
  }
  // add any querystring parameters
  m+="&"+document.location.href.replace(/^.*?(\?|$)/,"");

  //alert(m.replace(/&/g,' '))
  /*
  var e = document.createElement("script");
  e.src = Json + '?' + m;
  e.type="text/javascript";
  document.getElementsByTagName("head")[0].appendChild(e);
  */
  ///* not using http request...
  var r=new XMLHttpRequest();
  r.onreadystatechange=function() {
    if(r.readyState==4) {
      if(r.status==200) {
        //alert(r.responseText);
        if(r.responseText.match(/^DynoFormShow\(/)) {
         eval(r.responseText);
        } else {
         alert("Error communicating with the server; did your session time out? Try logging in again.");
        }
      } else {
        //alert("I'm sorry -- there was a problem submitting your information. Try making it shorter and try again.");
        //alert('bad status: '+r.status+' -- '+r.responseText);
      }
    }
  };
  r.open("POST", Json, true);
  r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  r.setRequestHeader("Content-Length",m.length);
  r.send(m);
  //r.open("GET", Json + '?' +m, true); r.send('');
  //*/
 } else {
  alert('DynoForm ' + form + ' is not on this page.')
 }
}

function DynoFormsParm(p,form) {
 var r='&'+p+'=';
 if($(p)) {
  if($(p).type=='checkbox' || $(p).type=='radio') {
   r+=$(p).checked?1:0;
  } else {
   r+=encodeURIComponent($(p).value);
  }
  //alert(p + "=" + $(p).value);
 } else if( DynoForms[form].r[p] ) {
  r+=encodeURIComponent(DynoForms[form].r[p]);
 } else {
  r+=encodeURIComponent(DynoForms[form][p]);
 }
 //r=r.replace(/\./g,'%2e');
 return r;
}

function $(id) {
 return document.getElementById(id);
}

function geval(c) {
 //alert(c);
 setTimeout( c, 0 );
}

function DynoFormShow(r,err) {
 var df=DynoForms[r.object];
 df.r=r;
 if (err == '') {
  // r.userid, r.username, r.object, r.action, r.script, r.template, r.onClick, r.head, r.result, r.data, r.parms
  if(df.control.type=='select-one') {
   // this is a select -- set the options and the value from the parent
   DynoFormsOptions(r);
   if(df.parent.r.result) {
    var v=df.parent.r.result[r.object];
    if (v) {df.control.value=v;}
   }
  } else if(r.template) {
   var t=r.template.replace(/\$([a-zA-Z_]\w+)/g,'<div id=$1></div>');
   df.control.innerHTML=t + r.footer;
   // need to set the form values based on the parms
   eval(r.parms.replace(/([^;\s][^;]*)/g,"DynoFormsParm2Form('$1',r.object)"));
  } else {
   // its a list
   DynoFormsList(df);
  }
  if(r.script) { geval(r.script); }
 } else {
  if(df.control.type=='select-one') {
   alert('DynoForm error: '+err);
  } else {
   df.control.innerHTML='<p>DynoForm error: '+err+'</p><a href="javascript:DynoForm(\''+ r.object + '\',\'\')">return</a>';
  }
 }
}

function DynoFormsParm2Form(parm,form) {
 // insert the r.value into the form value, based on control type
 if(!DynoForms[form]) {alert(form+' is not defined'); return;}
 if(!DynoForms[form].r.result || !$(parm) || !DynoForms[form].r.result[parm]) {return;}
 var type=$(parm).type;
 if(type == 'text' || type=='textarea' || type=='hidden' || type=='select-one' || type=='password') {
  $(parm).value=DynoForms[form].r.result[parm];
 } else if(type=='checkbox') {
  $(parm).checked=(DynoForms[form].r.result[parm]==1 || DynoForms[form].r.result[parm]=='True');
 } else {
  $(parm).innerHTML=DynoForms[form].r.result[parm];
 }
}

function DynoFormsSelect(id,v) {
 var r='<select id="'+id+'">';
 for(var n=0; n< v.length; n++) {
  r+='<option value="'+v[n][0]+'">'+v[n][1]+'</option>';
 }
 r+='</select>';
 return r;
}

function DynoFormsOptions(r) {
 var c=DynoForms[r.object].control;
 var v=r.data;
 for(var n=0; n<v.length; n++) {
  var o=document.createElement('option');
  o.value=v[n][0]; o.text=v[n][1];
  c.options.add(o);
 }
}

function DynoFormsList(d) {
 d.sortcol=-1;
 d.direction=1;
 DynoFormsListRender(d);
}

function q(v) { return "'"+v.replace(/'/g,"\\'")+"'"; }

function DynoFormsListStyle(id,style) {
 DynoForms[id].style=style;
 DynoFormsListRender(DynoForms[id]);
}

function DynoFormsListRender(d) {
 if(!d.r.head) {return;}
 var r="";
 var href='<a href="javascript:DynoFormSort('+q(d.r.object)
 var sc=d.r.sortcol;
 r+='<table style="'+d.style+'">';
 if(d.r.onClick) {r+="<tr><td>edit details</td>";}
 for(var cc=1; cc<d.r.head.length; cc++) {
  if(d.r.head[cc].substr(0,1) != '_') {
   r+="<td>"+href+','+cc+')">';
   if( cc==sc ) { r+="<b>"+d.r.head[cc]+"</b>"; } else { r+=d.r.head[cc]; }
   r+="</a></td>";
  }
 }
 r+="</tr>";
 for(var n=0; n<d.r.data.length; n++) {
  r+='<tr id="DFTR_'+d.r.data[n][0]+'"';
  if(n & 1) {
  } else {
   r+='bgcolor='+d.acolor;
  }
  r+='>';
  if(d.r.onClick) {r+='<td align=center><a href="javascript:DynoFormClick('+q(d.r.object)+','+q(d.r.data[n][0])+')"><img src=/images/edit.gif alt=edit border=0></a></td>';}
  for(var nn=1; nn<d.r.data[n].length; nn++) {
   if(d.r.head[nn].substr(0,1) != '_') {
    r+="<td>"+d.r.data[n][nn]+"</td>";
   }
  }
  r+="</tr>";
 }
 r+="</table>" + d.r.footer;
 d.control.innerHTML=r;
}

var DFDateRe=/^\s*(\d+)[\/\-](\d+)[\/\-](\d+)/;
function DFDate(d) {
 var m=DFDateRe.exec(d);
 if(m) { return new Date(m[3],m[1],m[2]); } else { return null; }
}
function DFCmp(a,b) {
 // sort by alpha, numeric or date depending
 var aa=DFDate(a);
 if(aa) {
  var bb=DFDate(b);
  return aa > bb? 1: aa<bb? -1: 0;
 }
 return isNaN(a-b)? a>b? 1:a<b? -1: 0: a-b;
}
function DynoFormSort(object, col) {
 var o=DynoForms[object];
 if(o.sortcol==col) {o.direction *=-1} else {o.direction=1}
 var updown=o.direction;
 o.r.data=o.r.data.sort(function(a,b) {return updown*DFCmp(a[col],b[col]);});
 o.sortcol=col;
 DynoFormsListRender(o);
}

function DynoFormNotAssigned(object) {
 $(object).innerHTML='<p>This DynoForm has not yet been assigned.</p>';
}

function DynoFormClick(form,id) {
 DynoForms[form].id=id;
 if(DynoForms[form].r && DynoForms[form].r.onClick) {
  eval(DynoForms[form].r.onClick);
 } else {
  alert('onClick has not been defined for form '+form);
 }
}

function DynoFormData(form) {
 return DynoForms[form].r.data;
}

function dateok(d) {
 if( ! d.match(/^\d+\/\d+\/\d+( \d+:\d+(:\d+)?( [aApP][mM])?)?$/)) {
  alert("Enter dates like this: mm/dd/yy");
  return 0;
 }
 1; // return a non-zero value
}

function replaceTR(id,html) {
 var tr=document.getElementById(id);
 var cols=tr.cells.length;
 for(var n=1; n<cols; n++) tr.deleteCell(0);
 tr.cells[0].colSpan=cols;
 tr.cells[0].innerHTML=html;
}