// DynoForms -- dynamic forms for Dot Net Nuke
// (C) 2006 John Hanna for Uncommon Solutions
//Test Save
var DynoForms;
var Json;
var DFO; if(DFO==undefined) DFO={};
var jsint = 0;

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);
   //alert(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(';');
   // for the subforms
   var fp=parent.r.object;
   p=p.replace(/([^;\s][^;]*)/g,"m+=DynoFormsParm('$1',fp)");
   eval(p);
  }
  // add any querystring parameters
  if(document.location.href.match(/\?/)) 
   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);
      }
    }
  }
 // alert(m);
 r.open("POST", Json, true);

  r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  r.setRequestHeader("Content-Length",m.length);
 //if(jsint!=0) {alert(m)};

  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') {
   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( 'try {'+c+'} catch(exception) {alert(exception.message)}', 0 );
 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>');
   if(r.template.match(/^\s*<\s*td/)) {
     updateRow(df.control,r.template);
   } else {
     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 {
	if(df.control.tagName=='TR')	{
		updateRow(df.control, '<p>DynoForm error: '+err+'</p><a href="javascript:DynoForm(\''+ r.object + '\',\'\')">return</a>')
	} 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') {
  $(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 || d.control.tagName=='TR') {return;}
 var r="";
 var href='<a href="javascript:DynoFormSort('+q(d.r.object)
 var sc=d.r.sortcol;
 r+='<table class="Normal" 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=imagesd/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, dir) {
 var o=DynoForms[object];
 if(dir){o.direction=dir}
 else{ if(o.sortcol==col) {o.direction *=-1} else {o.direction=1}}
 var updown=o.direction;
 //if(! o.r){
 //alert('o.r undefined.  Object is :' + object + '. Col is ' + col + '.');
 //setTimeout("alert('Action is: ' + DynoForms['customer'].r.action + '. Data is ' + DynoForms['customer'].r.data + '.')",2000);
 //}
 //else {
 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");
 }
 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;
 tr.innerHTML=html;
}

function updateRow(tr,s) {
 // this function puts the <td></td> stuff into tr
 // strip off the last <\td> and split the <td>'s into an array
 var a=s.replace(/<\s*\/td\s*>$/i,'').split(/<\s*\/td\s*>/i);
 // remove any existing <td>'s from the array
 while(tr.cells.length > 0) tr.deleteCell(0);
 //alert(a.join('; '));
 for(var i=0; i<a.length; i++) {
  // check for a colspan
  var b=a[i].match(/colspan\s*=\s*"?(\d+)/i);
  // get rid of the <td> tag
  var s=a[i].replace(/<\s*td[^>]*>/i,'');
  // add a cell
  var td=tr.insertCell(i);
  // set the content of the cell
  td.innerHTML=s;
  // set the colspan if there was one
  if(b && b[1]) td.colSpan=b[1];
  //alert('i='+i+' a='+a[i]+'; b='+b[1]);
 }
}
