	/*
Copyright (c) 2000 - Incordia AB, site: http://www.incordia.se, email: info@incordia.se
*/

function findFrame(n, w)
{
	var wi;
	if(!w) w = window.top;
	if((wi = w.frames[n])) return wi;
	for(var i = 0; i < w.frames.length; i++) if((wi = findFrame(n, w.frames[i]))) return wi;
	return null;
}

function openFrame(u, n)
{
	var w = findFrame(n);
	if(w) w.location.href = u;
	else w = window.open(u, n);
	return w;
}

function trimString(s)
{
	return s.replace(/^(\s)+/, "").replace(/(\s)+$/, "");
}

function verifyOrgId(n)
{
	var re = new RegExp("^([0-9]{6})-([0-9]{4})$", "i");
	var ma = re.exec(n);
	return (ma && (calculateCheckDigit(ma[1] + ma[2].substring(0,3)) == ma[2].charAt(3)));
}

function verifyEmail(e, mandatory)
{
	if(trimString(e) == "") !mandatory;
	var re = /^.+@.+\..+$/i;
	return (re.exec(e) != null);
}

function verifyPhone(p, mandatory)
{
	if(trimString(p) == "") !mandatory;
	var re = /^([0-9]|\s|\/|\+|\-|\(|\))+$/i;	
	return (re.exec(p) != null);
}

function parseFloatEx(f)
{
	return parseFloat(f.toString().replace(",", "."));
}

function formatPrice(p, l, delim)
{
	var b = Math.pow(10, l);

	p = parseFloatEx(p);
	p = Math.round(p * b) / b;

	p = p.toString().split(".");

	var h = "", d = "", j = 0;

	var nil = "0000000000000000000";

	if(p.length == 1)
		d = nil.slice(0, l);
	else if(p[1].length < l)
		d = p[1] + nil.slice(0, l - p[1].length);
	else
		d = p[1];

	for(var i = p[0].length - 1; i >= 0; i--)
	{
		if(j && (j % 3) == 0) h = " " + h;
		h = p[0].charAt(i) + h;
		j++;
	}

	if(l > 0)
	{
		if(!delim) delim = ",";
	}
	else
		delim = "";
	
	return h + delim + d;
}

function formatPriceEx(p, mf)
{
	// due to a bug in regexp for NS4, we need to loop
	for(var d = null; !d; d = /^.*\[([0-9]+)\].*$/ig.exec(mf));
	return mf.replace(/\[[0-9]\]/ig, formatPrice(p, d[1]));
}

function openWindow(url, windowname, width, height)
{
	var w, f = "scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no,resizable=1,width=" + width + ",height=" + height;
	
	w = window.open(url, windowname, f, true);
	
	if(w != null) w.focus();

	return w;
}

function list_setSelectedItem(l, v)
{
	for(var i = 0; i < l.options.length && l.options[i].value != v; i++);

	var ok = (i < l.options.length);

	if(ok) l.selectedIndex = i;

	return ok;
}

function calculateCheckDigit(num)
{
    var i, n, sum = 0, l;
    
    num = num.toString();
    l = num.length;

    for(i = l - 1; i >= 0; i--)
    {
        n = parseInt(num.charAt(i)) * (2 - ((l + 3 - i) % 2));
        sum += parseInt(Math.floor(n / 10) + (n % 10));
	}

	return (10 - (sum % 10)) % 10;
}

function first() {
	var args = $A(arguments);
	for(var i=0; i<args.length; ++i) {
		if(""+args[i]!="") return args[i];
	}
}

function validSSNbr(nr, checkdate)
{
	if(/^\s*\d{6}-{0,1}\d{4}\s*$/ig.exec(nr) == null) return false;
	nr = trimString(nr).replace("-", "");
	var chkdigit = calculateCheckDigit(nr.substring(0, nr.length - 1));
	return (chkdigit == nr.substring(nr.length - 1, nr.length));
}


/******* New Functions - JDP ************/

function getWheelDelta(event) {
   var delta = 0;
   if (!event) event = window.event;
   if (event.wheelDelta) {
      delta = event.wheelDelta/120;
      if (window.opera) delta*=-1;
   } else if (event.detail) {
      delta = -event.detail/3;
   }
   return delta;
}
function addWheelEvent(obj, fn) {
   var f = function(event) { 
      var ev = new Object();
      ev.wheelDelta = getWheelDelta(event);
      if(!fn(ev,this)){if(event.preventDefault)event.preventDefault();event.returnValue=false; return false;}return true;
   }
   if(obj.addEventListener){
      obj.addEventListener('DOMMouseScroll', f, false); 
      return true;
   } else if (obj.attachEvent){
      window.attachEvent('onmousewheel', f);
      document.attachEvent('onmousewheel', f);
   } else {
      return false;
   }
}


function addEvent(obj, evType, fn, wrap){
	var f = function(event){if(!fn(event,this)){if(event.preventDefault)event.preventDefault();event.returnValue=false;return false;}return true;}
   if(evType=="mousewheel") {
      addWheelEvent(obj, wrap?f:fn);
      return;
   }
	if(obj.addEventListener){
		obj.addEventListener(evType, wrap?f:fn, false); 
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent('on'+evType, wrap?f:fn);
		return r;
	} else {
		return false;
	}
}

function traverse(item, sprompt) {
	var t = "";
	for(i in item) { t+=i+": "+item[i]+"\n"; }
	if(sprompt)prompt("",t);
	return t;
}

function MousePosition(e) {
	var mp = new Object();
	if(!e)e=window.event;
	if(e.clientX==-1 || e.clientY==-1) return false;
	mp.x = e.clientX; mp.y = e.clientY;
	return mp;
}
function getOffset(pos0,pos1) {
	var pos = new Object();
	if(pos0.x && pos1.x && pos0.y && pos1.y) {
		pos.x = pos0.x-pos1.x;
		pos.y = pos0.y-pos1.y;
		return pos;
	} else return false;
}
function stripPx(strr) { 
   if(strr=="") strr = "0px";
   return parseInt(strr.substr(0,strr.length-2)); 
}
function ElementPosition(em) {
	var l = em.offsetLeft; var t = em.offsetTop;
	var w = em.offsetWidth; var h = em.offsetHeight;
	emp = em; while(emp = emp.parentNode && emp.nodeName!="HTML") { l+=emp.offsetLeft?emp.offsetLeft:0; t+=emp.offsetTop?emp.offsetTop:0; }
	var op = new Object();
	op.x = l; op.y = t; op.w = w; op.h = h;
	return op;
}
function RealMouseOut(e,em) {
	var em = ElementPosition(em);
	if(!e)e=window.event;
	if(e.clientX==-1 || e.clientY==-1) return false; // Synaptic mouse wheels return -1 clientX while scrolling.
	if(e.clientX<=em.x || e.clientX>=(em.x+em.w)-8 || e.clientY<=em.y-(window.event?14:1) || e.clientY>=(em.y+em.h)) {
		return true;
	}
	return false;
}

function getElementsColl(collection, sattrib, svalue) {
   var cem;
   var coll = new Array();
   var seek = new RegExp("(^|\\s)" + svalue + "(\\s|$)"); // borrowed from Robert Nyman.
   for(var i=0; i<collection.length; ++i) {
      cem = collection[i];
      if(cem.attributes && cem.attributes[sattrib]) {
         if(svalue=="") {
            coll.push(cem);
         } else
         if(seek.test(cem.attributes[sattrib].value)) {
            coll.push(cem); 
         }
      }
   }
   return coll;
}
function getElements(parent, sattrib, svalue) {
   return getElementsColl(parent.getElementsByTagName("*"),sattrib,svalue);
}
document.getElements = function(sattrib, svalue) {
   return getElements(this,sattrib,svalue);
}
function overTime(seconds,interval,fn) {
   var end = new Date();
   end.setMilliseconds(end.getMilliseconds()+(seconds*1000));
   var f = function() {
      if(new Date().getTime()<end.getTime()) { 
         fn();
         setTimeout(f,interval*1000);
      }
   };
   setTimeout(f,interval*1000);
}

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, $A(arguments).concat(args));
  }
}
Function.prototype.bindPost = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

String.prototype.rtrim = function() {return this.substring(0,this.length-arguments[0]);}

function $() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
    if (arguments.length == 1)
      return element;
    elements.push(element);
  }
  return elements;
}
var eventDispatch = null;
var defaultBaseClasses = function() {
	eventDispatch = Base.extend({
		listeners: {},
		attachEvent: function(evtName, evtCallback) {
			evtName=evtName.replace(/^on/i,"");
			if(!this.listeners[evtName])return null; 
			return this.listeners[evtName].push(evtCallback);
		},
		registerEvent: function(evtName) {
			var list = $A(arguments);
			for(var i=0; i<list.length; ++i) {
				if(!this.listeners[list[i]])this.listeners[list[i]] = [];
			}
		},
		dispatchEvent: function(evtName, evtObject) {
			if(!this.listeners[evtName])return null;
			var responses = [];
			for(var i=0; i<this.listeners[evtName].length; ++i) {
				var response = this.listeners[evtName][i](evtObject, this);
				if(response) responses.push(response);
			}
			return responses;
		}
	});

}