/*
 * This function will not return until (at least)
 * the specified number of milliseconds have passed.
 * It does a busy-wait loop.
 */
function pause(numberMillis) {
    var now = new Date();
    var exitTime = now.getTime() + numberMillis;
    while (true) {
        now = new Date();
        if (now.getTime() > exitTime)
            return;
    }
}


/*
 * This function sets up a javascript mailto:
 */
function mailTo(name, domain, options) {
 var mailToString = null;
 if ((name != null) && (domain != null) && (options != null)) {
  mailToString = "mailto:"+name+"@"+domain+"?"+options;
 }
 else if ((name != null) && (domain != null)) {
  mailToString = "mailto:"+name+"@"+domain;
 }

 if (mailToString != null) {
  window.location = mailToString;
 }
}


// return form object
function get_form() {
    //return document.forms[document.forms.length - 1]
    return document.forms[0]
}


// return reference to specified form field
function get_formfield(field) {
  return get_form().elements[field];
}


// set a list element to specified value
function set_list_value(name, value) {
  field = get_formfield(name)
  for (i=0; i < field.length; i++) {
    if (field.options[i].value == value) {
      field.selectedIndex = i
      return i
    }
  }
  alert("Item not found!")
}


// make_updater for calendar and formulator date fields
function make_updater(datefield) {
  updater = function (calendar) {
              var y = calendar.date.getFullYear()
              var m = calendar.date.getMonth() + 1
              var d = calendar.date.getDate()
              if (m < 10) m = "0" + m
              if (d < 10) d = "0" + d
              set_list_value('subfield_' + datefield + '_year', y)
              set_list_value('subfield_' + datefield + '_month', m)
              set_list_value('subfield_' + datefield + '_day', d)
              calendar.hide()
            }
  return updater
}



/*
 * Setup a calendar object
 *
 */
function calendar_setup(buttonid, formfield, statusfunc) {
  Calendar.setup({
    button         :    buttonid,  
    align          :    "tR",           
    singleClick    :    true,
    onClose        :    make_updater(formfield),
    disableFunc    :    statusfunc
  });
}


/*
 * Return True for invalid paydays
 */
function not_valid_payday(date, y, m, d) {
  dayofweek = date.getDay()

  switch(y) {
  case 2005:
    var holidays = {
      1 :  [1, 17],
      2 :  [21],
      5 :  [30],
      7 :  [4],
      9 :  [5],
      10 : [10],
      11 : [11,24],
      12 : [26]
    };
    break;
  case 2006:
    var holidays = {
      1 :  [2, 16],
      2 :  [20],
      5 :  [29],
      7 :  [4],
      9 :  [4],
      10 : [9],
      11 : [11, 23],
      12 : [25]
    };
    break;
  case 2007:
    var holidays = {
      1 :  [1, 15],
      2 :  [19],
      5 :  [28],
      7 :  [4],
      9 :  [3],
      10 : [8],
      11 : [12, 22],
      12 : [25]
    }
    break;
  case 2008:
    var holidays = {
      1 :  [1, 21],
      2 :  [18],
      5 :  [26],
      7 :  [4],
      9 :  [1],
      10 : [13],
      11 : [11, 27],
      12 : [25]
    }
    break;
  }

  // disable weekends
  if (dayofweek == 0 || dayofweek == 6)
    return true;
  
  // disable holidays (month is zero based)
  holidaysthismonth = holidays[m+1];
  if (!holidaysthismonth) 
    return false;
  for (var i in holidaysthismonth) 
    if (holidaysthismonth[i] == d) 
      return true;

  // day is ok
  return false;
}

/*
 * tooltip
 */

var tooltip=function(){
    var id = 'tt';
    var top = -65;
    var left = 15;
    var maxw = 300;
    var speed = 100;
    var timer = 1;
    var endalpha = 100;
    var alpha = 0;
    var tt,t,c,b,h;
    var ie = document.all ? true : false;
    return{
        show:function(v,w){
            if(tt == null){
                tt = document.createElement('div');
                tt.setAttribute('id',id);
                t = document.createElement('div');
                t.setAttribute('id',id + 'top');
                c = document.createElement('div');
                c.setAttribute('id',id + 'cont');
                b = document.createElement('div');
                b.setAttribute('id',id + 'bot');
                tt.appendChild(t);
                tt.appendChild(c);
                tt.appendChild(b);
                document.body.appendChild(tt);
                tt.style.opacity = 0;
                tt.style.filter = 'alpha(opacity=0)';
                document.onmousemove = this.pos;
            }
            tt.style.display = 'block';
            c.innerHTML = v;
            tt.style.width = w ? w + 'px' : 'auto';
            if(!w && ie){
                t.style.display = 'none';
                b.style.display = 'none';
                tt.style.width = tt.offsetWidth;
                t.style.display = 'block';
                b.style.display = 'block';
            }
            if(tt.offsetWidth > maxw){tt.style.width = maxw + 'px'}
            h = parseInt(tt.offsetHeight) + top;
            clearInterval(tt.timer);
            tt.timer = setInterval(function(){tooltip.fade(1)},timer);
        },
        pos:function(e){
            var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY;
            var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX;
            tt.style.top = (u - h) + 'px';
            tt.style.left = (l + left) + 'px';
        },
        fade:function(d){
            var a = alpha;
            if((a != endalpha && d == 1) || (a != 0 && d == -1)){
                var i = speed;
                if(endalpha - a < speed && d == 1){
                    i = endalpha - a;
                }else if(alpha < speed && d == -1){
                    i = a;
                }
                alpha = a + (i * d);
                tt.style.opacity = alpha * .01;
                tt.style.filter = 'alpha(opacity=' + alpha + ')';
            }else{
                clearInterval(tt.timer);
                if(d == -1){tt.style.display = 'none'}
            }
        },
        hide:function(){
            clearInterval(tt.timer);
            tt.timer = setInterval(function(){tooltip.fade(-1)},timer);
        }
    };
}();

/*
 * get url parameters
 */

function gup(name)
{
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}

/*
 *  url encode/decode
 */
 
function urlEncode(obj) {
	var encoded = encodeURIComponent(obj);
    return encoded;
}
function urlDecode(obj) {
	var decoded = decodeURIComponent(obj.replace(/\+/g,  " "));
    return decoded;
}
