/* common.js 
*   written by Jeff Arenberg  jeff@arenberg.net
*/

/**
* The SWI global namespace object
*/
if (typeof SWI == "undefined") {
  var SWI = {};
}

SRT = {};
SWI.MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

SWI.namespace = function() {
  var a=arguments, o=null, i, j, d;
  for (i=0; i<a.length; ++i) {
    d=a[i].split(".");
    o=SWI;

    /* YAHOO is implied, so it is ignored if it is included */
    for (j=(d[0] == "SWI") ? 1 : 0; j<d.length; ++j) {
      o[d[j]]=o[d[j]] || {};
      o=o[d[j]];
    }
  }

  return o;
};

SWI.namespace("AO", "PC", "C", "F");

function $() {
  var es = [];
  for (var i = 0; i < arguments.length; i++) {
    var e = arguments[i];
    if (typeof e == 'string')
      e = document.getElementById(e);
    if (arguments.length == 1)
      return e;
    es.push(element);
  }
  return es;
}

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Array.prototype, {
  append : function(from) {
    for (var i=0; i < from.length; i++) this.push(from[i]);
  },
  indexOf : function(object) {
    for (var i = 0; i < this.length; i++)
      if (this[i] == object) return i;
    return false;
  }
});

// Pop-up Calendar

Object.extend(SWI.PC, {
  handleSelect : function(type,args,obj) { 
    var d = args[0][0];
    $(obj.tField).value = d[0] + '-' + SWI.C.LZ(d[1]) + "-" + SWI.C.LZ(d[2]);
    obj.hide();
  }, 

  popCal : function(d) {
    var t = "ae_cal";
    var cal = new YAHOO.widget.Calendar("cal1", t, {close: true});
    var cc = cal.cfg;
    cal.tField = d;
    cc.setProperty("DATE_RANGE_DELIMITER", ",");
    cc.setProperty("DATE_FIELD_DELIMITER", "-");
    cc.setProperty("MDY_MONTH_POSITION", 2);
    cc.setProperty("MDY_DAY_POSITION", 3);
    cc.setProperty("MDY_YEAR_POSITION", 1);
    cal.selectEvent.subscribe(SWI.PC.handleSelect, cal, true); 
    var dv = $(d);
    if (dv.value != "") {
      cal.select(dv.value);
      var fd = cal.getSelectedDates()[0];
      if (fd) cc.setProperty("pagedate", (fd.getMonth()+1) + "-" + fd.getFullYear());
    }
    cal.render();
    cal.show();

    // move below calling field
      var dp = YAHOO.util.Dom.getXY(d);
    dp[1] += dv.offsetHeight + 2;
    YAHOO.util.Dom.setStyle(t, "z-index", 5);
    YAHOO.util.Dom.setXY(t, dp);
  }
});

// Yahoo connection

Object.extend(SWI.AO, {
  hSuccess : function(o) {
    o.argument.hRes(o.responseText, o.argument.hV, o.argument.hF);
  },
  hFailure : function(o) {
    alert(o.statusText);
  },
  sRequest : function(d, r, v, f) {
    this.callback.argument = { hRes:r, hV:v, hF: f };
    YAHOO.util.Connect.asyncRequest('POST', (v.dir || "") + 'hnd.php', this.callback, 'd='+encodeURIComponent(typeof d == 'string' ? d : toJSON.m(d)));
  }
});

Object.extend(SWI.AO, {
  callback : {
    success : SWI.AO.hSuccess, 
    failure : SWI.AO.hFailure, 
    timeout : 100000
  }
});

Object.extend(SWI.C, {
  sLoad : function(m) {
    var d = $("div_load");
    if (!d) {
      d = document.createElement("div");
      d.id = "div_load";
      document.body.appendChild(d);
      d.innerHTML = "Loading...";
    }
    YAHOO.util.Dom.setStyle(d, "visibility", (m==0?"hidden":"visible"));
  },

  addFoot : function() {
    var f = $("ft");
    if (f != null) f.innerHTML = "&copy; 2007 Software Incubators, Inc.";
  },

  fmtToday : function() {
    var d = new Date();
    return d.getFullYear() +"-" + SWI.C.LZ(d.getMonth()+1) + "-" + SWI.C.LZ(d.getDate());
  },

  doToday : function(s) {
    $(s).value = SWI.C.fmtToday();
  },

  showHelp : function() {
    var F = SWI.F;
    F.start2("Help");
    F.add($("help_text").innerHTML);
    F.end2();
    F.show();
  },

  showAE : function(v, i) {
    var d, dd, n, nx, t, vv;
    var dp, tt, nu, ms;
    var vs = v.vst[v.tabsel[v.vstsel]].d, vf = v.fld;
    var F = SWI.F;
    t = (i == 0 ? "Add" : "Edit");
    F.start(t, (v.doAE ? v.doAE : "SWI.C.doAE") + "("+v.nm+")", "ae_err");
    F.sTab(' border="0" cellpadding="0" cellspacing="0" class="tblF" style="background-color:#FFFFCC;"');
    for (n=0; n<vs.length; n++) {
      d = vs[n];
      /* if calc, ignore */
      if (d.c) continue;
      dd = vf[d.f] || {};
      nx = v["h_"+d.f];
      vv = d.e ? eval(d.e) : v.d[i][v["h_"+d.f]];

      dp = d.d || dd.d;
      tt = d.t || dd.t;
      nu = d.n || dd.n || "";
      ms = d.m || dd.m || "";
      if (dp == 3) 
	F.addR2 (tt+":", F.makeSelect("ae_"+n, (i==0?"":vv), eval(d.v)));
      else if (dp == 5) 
	F.addR2 (tt+":", F.makeCheck("ae_"+n, (i==0?"":eval(d.v)), vv, ms));
      else 
	F.addR2 (tt+":", F.makeInput("ae_"+n, (i==0?"":vv), 40, 80, nu == 1 ? F.fBE("ae_err", "ae_"+n) : ""));
    }

    F.addR2 ("", F.makeButton("done", "Save", 1) + "&nbsp;" + F.makeButton("cancel", "Cancel", 0, "SWI.F.close()"));
    F.eTab();
    F.add(F.makeHidden("ae_id", i));
    F.end();
    if (F.show(SWI.C.fClose, i)) SWI.C.hiRow2(i, 1);
  },

  fClose : function(i) {
    SWI.C.hiRow2(i, 0);
  },

  doAE : function(v, fc) {
    var d, dd, i, vv, n, nx, t, val;
    var nu;
    var vs = v.vst[v.tabsel[v.vstsel]].d, vf = v.fld;
    var F = SWI.F;
    i = F.getVal("ae_id", 0);
    
    vv = v.d[i];
    for (n=0; n<vs.length; n++) {
      d = vs[n];
      /* if calc, ignore */
      if (d.c) continue;
      dd = vf[d.f] || {};
      nx = v["h_"+d.f];
      nu = d.n || dd.n || "";

      if (d.e) {
	val = F.getValC("ae_"+n);
	var nv = eval(d.v);
	vv[nx] &= ~nv;
	vv[nx] |= val;
      }
      else 
	vv[nx] = F.getVal("ae_"+n, vv[nx] || "");
      if (nu == 1 && vv[nx] == "") {
	F.fE("ae_err", "ae_"+n, "Value can not be blank.");
	return false;
      }
    }
    SWI.AO.sRequest(SWI.C.doBnd((i==0?"AR":"ER"), i, v), SWI.C.handleRes, v);
    return false;
  },

  handleRes : function(data, v, fb) {

    var i;
    var dd = toJSON.p(data);
    var F = SWI.F;

    switch(dd['c']) {
    case "RD":
      window.location.href = dd['loc'];
      break;

    case "CE":
      if (fb.f) fb.f(fb.v, dd);
      break;

    case "RR":
      SWI.C.doRead(dd, v);
      if (dd['tb'] && v.tbs) v.tbs[dd['tb']] = 1;
      if (fb) {
	if (fb.draw) {
	  v.rebuild = true;
	  v.draw();
	}
	if (fb.f) {
	  fb.f(fb.v, fb.i);
	}
      }
      SWI.C.sLoad(0);
      break;

    case "AR":
      i = dd['id'];
      if (v.dObj) {
	v.d[i] = {};
	Object.extend(v.d[i], v.d[0]);
	v.d[0] = {};
      }
      else {
	v.d[i] = [];
	v.d[i].append(v.d[0]);
	v.d[0] = [];
      }
      v.SS.push(i);
      v.rebuild = true;
      F.close();
      v.draw();
      SWI.C.animTab(i);
      if (v.updoc) v.updoc(v);
      break;

    case "ER":
      i = dd['id'];
      F.close();
      v.rebuild = true;
      v.draw();
      SWI.C.animTab(i);
      break;
    }
  },


  setDP : function(v, n, title, align, disp, nonull, misc) {
    v.dc[n] = {};
    var w = v.dc[n];
    w.tt = title;
    w.align = align;
    w.disp = disp;
    w.nonull = nonull;
    w.misc = misc;
  },

  doBnd : function(cmd, i, v) {
    return {c: cmd, t: v.table, i: i, h: v.hds, d: v.d[i]};
  },

  doRead : function(r, v, f) {
    var m, n, dd, id;
    v.table = v.table || r.t;
    v.d = v.d || [];
    v.SS = v.SS || [];
    v.t = v.t || [];
    v.dObj = v.dObj || f;
    v.hds = [];
    v.hds.append(r.h);
    if (!f) for (m=0; m < v.hds.length; m++) v["h_"+v.hds[m]] = m;
    dd = r.d;
    for (m=0; m < dd.length; m++) {
      id = dd[m][0];
      v.SS.push(id);
      if (f) {
	v.d[id] = {};
	for (n=0; n<v.hds.length; n++) v.d[id][v.hds[n]] = dd[m][n];
      }
      else {
	v.d[id] = [];
	v.d[id].append(dd[m]);
      }
    }
    v.d[0] = f ? {} : [];
  },

  iSort : function (x, y) {
    try {
      if (SRT.CC) {
	var i, v = SRT.V;
	i = x;
	a = eval(SRT.TF);
	i = y;
	b = eval(SRT.TF);
      }
      else {
	a = SRT.TB[x][SRT.TF].toLowerCase();
	b = SRT.TB[y][SRT.TF].toLowerCase();
      }

      if (SRT.TD == 2) {
	a = parseFloat(a) || 0;
	b = parseFloat(b) || 0;
      }

      if (a > b) return (SRT.TR ? -1 : 1);
      if (a < b) return (SRT.TR ? 1 : -1);
    } catch(e) {}
    return 0;
  },

  cCmpl : function(v, f) {
    if (f == v.sort) v.rsort = (v.rsort ? 0 : 1);
    else v.rsort = 0;
    v.sort = f;
    v.rebuild = true;
    if (v.upsort) v.upsort();
    v.draw();
  },

  Hdr : function(v, f, t, a) {
    return "<td id='hdr"+f+"' nowrap class='cellhd point'" + (a!="" ? "align="+a : "") +
      " onmouseover='SWI.C.hiHdr2("+f+",1)' onmouseout='SWI.C.hiHdr2("+f+",0)' " +
        " onclick='SWI.C.cCmpl("+v.nm+","+f+")'" +
          "><span class='sort"+(f==v.sort?(v.rsort?"1":"0"):"")+"' >"+t+"<span></td>";
  },

  Tbd : function(t, a, v) {
    return '<td nowrap class="cell" ' + (v!="" ? 'valign="'+v+'"' : "") + (a!="" ? 'align="'+a+'"' : "") + '>'+(t==""||t==null?"&nbsp;":t)+'</td>';
  },

  TbdLT : function(t) {
    return SWI.C.Tbd(t, "left", "top");
  },

  Fmny : function(s) { 
    if (s == "") return "$0.00";
    var v, r, ss;
    ss = parseFloat(s) * 100 + 0.5;
    v = parseInt(ss);
    r = "$" + parseInt(v/100) + "." + parseInt((v%100)/10) + (v%10);
    return r;
  },

  Cbz : function(s) { 
    if (s == "") return 0;
    else return s; 
  },

  LZ : function(x){return(x<0||x>9?"":"0")+x},

  fixBR : function(s) { return (typeof s == 'string') ? s.replace(/\r\n|[\r\n]/g, "<br/>") : s; },
  fixFC : function(f) {
    return f.replace(/F:(\w+):/g,"v.d[i][v.h_$1]").replace(/C:(\w+):/g,"v.cst.$1");
  },

  Fng : function(s) {
    if (s == "") return "0";
    return (s < 0 ? "("+(-s)+")" : s);
  },

  startTT : function(d) {
    var ntb, nbd, nrw;
    ntb = document.createElement("table");
    nbd = document.createElement("tbody");
    nrw = document.createElement("tr");
    nbd.appendChild(nrw);
    ntb.appendChild(nbd);
    $(d).appendChild(ntb);
    return nrw;
  },

  initTabs : function(d, l, k, a, cb, bt) {
    var t, m, dd, td, tb;
    
    td = document.createElement("td");
    dd = document.createElement("div");
    dd.id = d+""+k;
    dd.className = bt ? "nav_btn" : "nav_tab";
    $(d).appendChild(td);
    td.appendChild(dd);

    m = new YAHOO.widget.TabView({ id: d+k+"yt" });
    for (var n=0; n<l.length; n++) {
      t = { label: l[n] };
      if (n == a) t.active = true;
      tb = new YAHOO.widget.Tab(t);
      m.addTab(tb);
      tb.addListener('click', cb, [k, n]);
    }
    m.appendTo(dd);
    return td;
  },

  animTab : function(i) {
    var r = $("row"+i);
    if (!r) return;
    var a = new YAHOO.util.ColorAnim(r, { backgroundColor: { from: '#FFFF00', to: '#FFFFFF' }}, 1.5);
    a.animate();
  },


  hiRow : function(i, m) {
    if (m == 0) YAHOO.util.Dom.removeClass("row"+i, "rowH");
    if (m == 1) YAHOO.util.Dom.addClass("row"+i, "rowH");
  },

  hiRow2 : function(i, m) {
    if (m == 0) YAHOO.util.Dom.removeClass("row"+i, "inedit");
    if (m == 1) YAHOO.util.Dom.addClass("row"+i, "inedit");
  },

  hiHdr2 : function(i, m) {
    var s = (typeof i == "object")
      if (m == 0) YAHOO.util.Dom.removeClass(s?i:"hdr"+i, "hiHdr");
    if (m == 1) YAHOO.util.Dom.addClass(s?i:"hdr"+i, "hiHdr");
  },

  doExport : function(v, excl, fn, srt) {
    var k, wc, n, i, vv, b, fl;

    wc = "id in (";
    for (k=0, n=0; k<v.SS.length; k++) {
      i = v.SS[k];
      vv = v.d[i];

      b = true;
      eval(v.eflt);
      if (!b) continue;

      if (n > 0) wc += ",";
      wc += i;
      n++;
    }
    wc += ")";
    if (srt) wc += " order by "+srt;

    fl = "";
    for (k=0, n=0; k<v.hds.length; k++) {
      if (excl.indexOf(v.hds[k]) !== false) continue;
      if (n > 0) fl += ",";
      fl += "`"+v.hds[k]+"`";
      n++;
    }

    $("export_d").value = toJSON.m({fn:fn, fl:fl, t:v.table, wc:wc});
  },

  drawTab : function(fltr) {
    var i, v, l="", n, w, vv, b, k, m, vs, d, dd, vf, dp, pp, dt;

    v = this;
    vs = v.vst[v.tabsel[v.vstsel]].d;
    vf = v.fld;

    if (v.rebuild) {
      SRT.TB = v.d;
      SRT.CT = v.cst;
      dd = vs[v.sort];
      if (!dd) { v.sort = 0; dd = vs[v.sort]; }
      if (dd.c) {
	SRT.TF = dd.c;
	SRT.CC = 1;
	SRT.V = v;
      }
      else {
	SRT.TF = v["h_"+dd.f];
	SRT.CC = 0;
      }
      SRT.TR = v.rsort; 
      SRT.TD = dd.d || vf[dd.f].d || 0;
      v.SS.sort(SWI.C.iSort);
      v.rebuild = false;
    }
    var dff, ctb, ntb, cth, nth, cbd, nbd, th, tr, td, YE = YAHOO.util.Event;

    ctb = $(v.tbI);
    cth = $(v.tbI+"h");
    cbd = $(v.tbI+"b");

    ntb = document.createElement("table");
    ntb.id = v.tbI;
    ntb.className = "tbl";

    nth = document.createElement("thead");
    nth.id = v.tbI+"h";

    tr = document.createElement("tr");
    
    if (v.md == 1) {
      td = document.createElement("td");
      td.className = "cell point";
      td.id = 'row0';
      YE.addListener(td, "mouseover", function(e){SWI.C.hiRow(0, 1)});
      YE.addListener(td, "mouseout", function(e){SWI.C.hiRow(0, 0)});
      YE.addListener(td, "click", function(e){v.showAE(v, 0)});
      td.innerHTML = '<div class="btAdd"><img src="/images/bT35.png" /></div>';
      tr.appendChild(td);
    }

    for (n=0; n < vs.length; n++) {
      d = vs[n];
      /* no field and no calc */
      if (d.e) continue;
      dd = vf[d.f] || {};
      td = document.createElement("td");
      td.id = "hdr"+n;
      td.n = n;
      td.className = "cellhd point";
      td.noWrap = true;
      if (d.a || dd.a) td.align = d.a || dd.a;
      dp = d.d || dd.d;
      YE.addListener(td, "mouseover", function(e){SWI.C.hiHdr2(this, 1)});
      YE.addListener(td, "mouseout", function(e){SWI.C.hiHdr2(this, 0)});
      YE.addListener(td, "click", function(e){SWI.C.cCmpl(v, this.n)});
      td.innerHTML = "<span class='sort"+(n==v.sort?(v.rsort?"1":"0"):"")+"' >"+(d.t || dd.t)+"<span>";
      tr.appendChild(td);
      if (dp == 2) { v.t[n] = 0; dt++; }
    }

    nth.appendChild(tr);
    ntb.appendChild(nth);

    nbd = document.createElement("tbody");
    nbd.id = v.tbI+"b";

    dff = document.createDocumentFragment();

    for (k=0, m=0; k < v.SS.length; k++) {
      i = v.SS[k];

      b = true;
      for (n=0; n<fltr.length; n++) {
	eval(fltr[n]);
	if (!b) break;
      }
      if (!b) continue;

      tr = document.createElement("tr");
      tr.id = "row"+i;
      tr.className = "row"+(m%2);

      if (v.md == 1) {
	td = document.createElement("td");
	td.noWrap = true;
	td.className = "cell point";
	td.valign = "top";
	td.i = i;
	YE.addListener(td, "mouseover", function(e){SWI.C.hiRow(this.i, 1)});
	YE.addListener(td, "mouseout", function(e){SWI.C.hiRow(this.i, 0)});
	YE.addListener(td, "click", function(e){v.showAE(v, this.i)});
	td.innerHTML = '<div class="btEdit"><img src="/images/bT35.png" /></div>';
	tr.appendChild(td);
      }
      for (n=0; n < vs.length; n++) {
	d = vs[n];
	/* no field and no calc */
	if (d.e) continue;
	dd = vf[d.f] || {};
	vv = d.c ? eval(d.c) : v.d[i][v["h_"+d.f]];

	td = document.createElement("td");
	td.noWrap = true;
	td.className = "cell";
	td.valign = "top";
	if (d.a || dd.a) td.align = d.a || dd.a;
	dp = d.d || dd.d;
	if (dp == 2) {
	  pp = d.p || dd.p;
	  if (pp == "M") l = SWI.C.Fmny(vv);
	  else l = vv;
	}
	else if (dp == 5) l = (vv ? "Yes" : "");
	else l = (vv==null||v==""?"&nbsp;":SWI.C.fixBR(vv));
	td.innerHTML = l;
	tr.appendChild(td);

	dff.appendChild(tr);
	if (dp == 2) v.t[n] += vv;
      }
      m++;
    }
    nbd.appendChild(dff);

    ntb.appendChild(nbd);

    if (!ctb) v.dv.appendChild(ntb);
    else v.dv.replaceChild(ntb, ctb);

  }

});


