function get_obj(obj, is_style) {
	if (is_style) {
		if (document.getElementById) {
			return document.getElementById(obj).style;
		} else if (document.all) {
			return document.all[obj].style;
		} else if (document.layers) {
			return document.layers[obj];
		}
	} else {
		if (document.getElementById) {
			return document.getElementById(obj);
		} else if (document.all) {
			return document.all[obj];
		} else if (document.layers) {
			return document.layers[obj];
		}
	}
}

function vis_set(obj, vis) {
	if (vis == 1) {
		v = "visible";
		d = "";
	} else {
		v = "hidden";
		d = "none";
	}
	
	var elm = document.getElementById(obj).style.visibility;
	
	if (elm == 'hidden' || elm == 'visible')
	{
		get_obj(obj, 1).visibility = v;
	}
	else
	{
		get_obj(obj, 1).display = d;
	}
}

function vis_toggle(obj) {
	v = get_obj(obj, 1).visibility;	
	d = get_obj(obj, 1).display;	
	if (v == "hidden" || d == "none") {
		vis_set(obj, 1);
	} else {
		vis_set(obj, 0);
	}
}

function conf(u, msg) {
	if (confirm(msg))
		window.location.href = u;
}
function submitForm(elem)
{
	document.getElementById(elem).submit();
}
function swap_image(e, path) {
    e.src = path;
}

function clear_form(form_id) {

  var this_form = document.getElementById ? document.getElementById(form_id) : document.forms[form_id];
  if(this_form != null) {
    if(document.GetElementsByTagName) {
      elements = this_form.getElementsByTagName('input');
      for(x = 0, elem; elem = elements.item(x++); ) {
        eType = elem.getAttribute('type');
        switch(eType) {
          case 'textarea':
          case 'file':
          case 'password':
          case 'text':
            elem.value = "";
          break;
          case 'radio':
          case 'checkbox':
            elem.checked = false;
          break;
	}
      }

      elements = this_form.getElementsByTagName('select');
      for(x = 0, elem; elem = elements.item(x++); ) {
        eType = elem.getAttribute('type');
        switch(eType) {
          case 'select':
          case 'select-one':
            elem.selectedIndex = 0;
          break;
          case 'select-multiple':
            options = elem.options;
            for(y = 0, opt; opt = options[y++]; ) 
              opt.selected = false;
          break;
	}
      }
    }
    else {
      elements = this_form.elements;
      for(x = 0, elem; elem = elements[x++]; ) {
        eType = elem.type;
        switch(eType) {
          case 'textarea':
          case 'file':
          case 'password':
          case 'text':
            elem.value = "";
          break;
          case 'radio':
          case 'checkbox':
            elem.checked = false;
          break;
          case 'select':
          case 'select-one':
            elem.selectedIndex = 0;
          break;
          case 'select-multiple':
            options = elem.options;
            for(y = 0, opt; opt = options[y++];)
              opt.selected = false;
          break;
	}
      }
    }
  }

}

/*---------------------------------------------------------------------*/
/* Misc functions */

// add leading zeros
function alz(v, len) {
	if (v.length < len)
		return "0" + alz(v, len-1);
	else
		return v;
}

function empty(v) {
	if (typeof(v) == "undefined" || v == null || v == false || v == 0 || v == "" || v.length == 0)
		return true;
	return false;
}

function rand(min, max) {
	return Math.round(Math.random() * (max - min) + min);
}

function debug(txt) {
	var debug_mode = false;
	
	if (debug_mode)
		alert(txt);
}
 
function openPopup(url, name, width, height) {
	mywidth = width;
	myheight = height;
	myleft = (screen.width - mywidth) / 2;
	mytop = (screen.height - myheight) / 2;
	new_win = window.open(url, name, "width="+mywidth+",height="+myheight+",scrollbars=0,resizable=1,menubar=0,toolbar=0,status=0,location=0,directories=0,left="+myleft+",top="+mytop);
	new_win.opener.top.name = "opener";
	new_win.focus();
	return new_win;
}

function bindEvent(elm, evType, fn, useCapture) {
	elm = elem(elm);
	if (elm.addEventListener){
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent){
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	} else {
    	elm["on"+evType] = fn;
	}
}

document.getElementsByClassName = function(className) {
	var children = document.getElementsByTagName("*") || document.all;
	var elements = new Array();

	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var classNames = child.className.split(" ");
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elements.push(child);
				break;
			}
		}
	}
	return elements;
}

if (!Array.prototype.push) {
	Array.prototype.push = function() {
		var startLength = this.length;
		for (var i = 0; i < arguments.length; i++)
			this[startLength + i] = arguments[i];
		return this.length;
	}
}

function get_repr(obj) {
	var repr = "";
	
	repr += "Type: " + typeof obj + "\n";
	repr += "Value: ";
	if (typeof obj == "object" || typeof obj == "array") {
		repr += "{ ";
		for (var i in obj)
			repr += i + ": " + obj[i] + ", ";
		repr = repr.substr(0, repr.length-2) + " }";
	} else {
		repr += obj;
	}
	return repr;
}

function elem() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var name = arguments[i];
		var val = name;
		if (typeof name == "string") {
			val = document.getElementById(name);
			if (! val) {
				debug("Could not find element " + name);
				return false;
			}
		}
		if (arguments.length == 1) 
			return val;
		elements.push(val);
	}
	return elements;
}


/*---------------------------------------------------------------------*/
/*	Cookies */

var Cookies = {

	get: function(name, or_value) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return or_value;
	},

	set: function(name, value, days) {
		if (days)
		{
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		} else
			var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}	
}



/*---------------------------------------------------------------------*/
/*	HTML elements */

var Element = {

	getLeft: function(element) {
		element = elem(element);
		var left = 0;
		
		while (element.tagName != "BODY") {
			left = left + element.offsetLeft;
			element = element.offsetParent;
		}
		
		return left;
	},

	getTop: function(element) {
		element = elem(element);
		var top = 0;
		
		while (element.tagName != "BODY") {
			top = top + element.offsetTop;
			element = element.offsetParent;
		}
		
		return top;
	},

	getHeight: function(element) {
		return elem(element).offsetHeight;
	},
	
	getWidth: function(element) {
		return elem(element).offsetWidth;
	},
	
	toggle: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = 
				(element.style.display == "none" ? "" : "none");
		}
	},

	hide: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = "none";
		}
	},

	show: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = "";
		}
	},

	remove: function(element) {
		element = elem(element);
		element.parentNode.removeChild(element);
	},
		
	getValue: function(element) {
		var element = elem(element);
	
		var tag = element.tagName.toLowerCase();
		if (Element.Values[tag]) 
			return Element.Values[tag](element);
		else
			return Element.Values.other(element);
	},
	
	setValue: function(element, val) {
		var element = elem(element);
		
		var tag = element.tagName.toLowerCase();
		if (Element.SetValues[tag]) 
			Element.SetValues[tag](element, val);
		else
			Element.SetValues.other(element, val);
	},
	
	/* 
	 * A series of functions to obtain the value of an HTML element
	 * be it a regular element, an INPUT, etc..
	 *
	 */
	Values: {
		checkbox: function(element) {
			if (element.checked) 
				return element.value;
			else
				return false;	// should this be ""?
		},
		input: function(element) {
			switch (element.type.toLowerCase()) {
				case "checkbox":
					return Element.Values.checkbox(element);
				// all the text fields use the same function:
				case "hidden":
				case "password":
				case "text":
					return Element.Values.textarea(element);
				case "radio":
					return Element.Values.radio(element);
				default:
					return Element.Values.other(element);
			}
		},
		other: function(element) {
			return element.innerHTML;
		},
		radio: function(element) {
			var form = element.form;
			var name = element.name;
			for (var i = 0; i < form[name].length; i++) {
				if (form[name][i].checked) {
					return form[name][i].value;
				} 
			}
			return false;
		},
		select: function(element) {
			var idx = element.selectedIndex;
			if (idx >= 0) 
				return element.options[idx].value || element.options[idx].text;
			else
				return "";
		},
		textarea: function(element) {
			return element.value;
		}
	},
	
	SetValues: {
		input: function(element, val) {
			switch (element.type.toLowerCase()) {
				case "hidden":
				case "password":
				case "text":
					Element.SetValues.textarea(element, val);
					break;
				default:
					debug("Cannot set value for " + element.name + " of type: " + element.tagName);
					break;
			}
		},
		other: function(element, val) {
			element.innerHTML = val;
		},
		select: function(element, val) {
			Select.set(element, val);
		},
		textarea: function(element, val) {
			element.value = val;
		}
	}
}



/*---------------------------------------------------------------------*/
/*	CSS class manipulation */
Element.Class = {

	// add a class (className) to an element
	add: function(element, className) {
		Element.Class.remove(element, className);
		element = elem(element);
		element.className += (element.className.length > 0 ? " " : "") + className;
	},
	
	// return an array of the classes an element belongs to
	get: function(element) {
		element = elem(element);
		return element.className.split(' ');
	},
	
	// returns true or false depending on whether or not an element belongs to className
	has: function(element, className) {
		element = elem(element);
		if (!element || !element.className) return false;
		var re = new RegExp("\\b" + className + "\\b");
		if (!re.test(element.className)) return false;
	},
	
	// remove a class (className) from an element
	remove: function(element, className) {
		element = elem(element);
		var re = new RegExp("^" + className + "\\b\\s*|\\s*\\b" + className + "\\b", 'g');
		element.className = element.className.replace(re, '')
	},
	
	// toggle a class on or off
	toggle: function(element, className) {
		if (Element.Class.has(element, className))
			Element.Class.remove(element, className);
		else
			Element.Class.add(element, className);
	}	
}



/*---------------------------------------------------------------------*/
/*	Select manipulation */

var Select = {
	get: function(element) {
		return Element.getValue(element);
	},
	
	getIdx: function(element, val) {
		var e = elem(element);
		debug("Checking " + e + " -- " + e.options.length);
		for (var i = 0; i < e.options.length; i++) {
			debug("Checking " + e.options[i].value);
			if (e.options[i].value == val || e.options[i].text == val) {
				return i;
			}
		}
		return -1;
	},
	
	set: function(element, val) {
		var i = Select.getIdx(element, val);
		if (i != -1) {
			elem(element).selectedIndex = i;
			return true;
		}
		return false;
	},
	
	add: function(element, val, text) {
		var e = elem(element);
		if (! text)
			text = val;
		e.options[e.options.length] = new Option(text, val);
	},
	
	remove: function(element, val) {
		var e = elem(element);
		var i = Select.getIdx(e, val);
		if (i) {
			e.options[i] = null;
			return true;
		}
		return false;
	},
	
	clear: function(element) {
		elem(element).options.length = 0;
	},
	
	clone: function(element, new_element) {
		var e = elem(element);
		var new_e = elem(new_element);
		Select.clear(new_e);
		for (var i in e.options) 
			Select.add(new_e, e.options[i].value, e.options[i].text);
		new_e.selectedIndex = e.selectedIndex;
	}
}



/*---------------------------------------------------------------------*/
/*	Effects to use on a DIV */

var Effect = {
	appear: function(element) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.start = 0;
			x.finish = 100;
			x.delay = 65;
			x.current = x.start;
			x.fade();
		}
		
		x.fade = function() {
			if (x.current > x.finish) return;
			if (x.timer) clearTimeout(x.timer);
			x.setOpacity(x.element, x.current);
			x.current += 10;
			x.timer = setTimeout(x.fade, x.delay);
		}
		
		x.setOpacity = function(element, opacity) {
			opacity = (opacity == 100) ? 99.999 : opacity;
			element.style.filter = "alpha(opacity:"+opacity+")";
			element.style.opacity = opacity/100 /*//*/;
			element.style.display = "";			
		}
		
		x.init();
	},

	disappear: function(element, is_removed, is_waste_of_space) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.start = 100;
			x.finish = 0;
			x.delay = 85;
			x.current = x.start;
			x.fade();
		}
		
		x.done = function() {
			if (typeof(is_removed) == "undefined" || is_removed == true) {
				Element.remove(x.element);
			} else {
				if (empty(is_waste_of_space)) {
					Element.hide(element);
				}
			}
		}
		
		x.fade = function() {
			if (x.current < x.finish) {
				setTimeout(x.done, x.delay*2);
				return;
			}
			if (x.timer) clearTimeout(x.timer);
			x.setOpacity(x.element, x.current);
			x.current -= 10;
			x.timer = setTimeout(x.fade, x.delay);
		}
		
		x.setOpacity = function(element, opacity) {
			opacity = (opacity == 100) ? 99.999 : opacity;
			element.style.filter = "alpha(opacity:"+opacity+")";
			element.style.opacity = opacity/100 /*//*/;
			element.style.display = "";			
		}
		
		x.init();
	},
	
	flash: function(element) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.curPops = 0;
			x.nPops = 3;
			x.delay = 75;
			x.popColor = "#ff0000";
			x.background = x.element.style.backgroundColor == "" ? "#ffffff" : x.element.style.backgroundColor;
			x.setPop();
		}
		
		x.setPop = function() {
			if (x.curPops >= x.nPops) 
				return;
				
			x.element.style.background = x.popColor;
			x.curPops = x.curPops + 1;
			setTimeout(x.unPop, x.delay);
		}
		
		x.unPop = function() {
			x.element.style.background = x.background;
			setTimeout(x.setPop, x.delay);
		}
		
		x.init();
	},
	
	errorBlink: function(element) {
		var x = new Object();
		x.element_name = element;
		x.element = elem(element);
		
		x.init = function() {
			x.delay_show = 1000;
			x.delay_hide = 4000;
			x.element.style.fontWeight = "bold";
			x.element.style.color = "#cc0000";
			x.hide();
		}
		
		x.hide = function(element) {
			if (x.timer)
				clearTimeout(x.timer);
			x.timer = setTimeout(x.show, x.delay_show);
			Effect.disappear(x.element_name, false, true);
		}
		
		x.show = function(element) {
			if (x.timer)
				clearTimeout(x.timer);
			x.timer = setTimeout(x.hide, x.delay_hide);
			Effect.appear(x.element_name);
		}
		
		x.init();
	}
}



/*---------------------------------------------------------------------*/
/*	Make a DIV into a tooltip */

var Tooltip = {
	show: function(element, reference, offset_x, offset_y) {
		e = elem(element);
		
		offset_x = (empty(offset_x)) ? 0 : offset_x;
		offset_y = (empty(offset_y)) ? 0 : offset_y;
		
		x = Element.getLeft(reference) + offset_x;
		y = Element.getTop(reference) + offset_y;
		
		e.style.left = x + "px";
		e.style.top = y + "px";
		
		Element.show(element);
	},
	
	hide: function(element) {
		Element.hide(element);
	}
}

function MM_preloadImages() 
{ //v3.0
  var d=document; 
  if(d.images)
  { 
  	if(!d.MM_p) 
  	 d.MM_p = new Array();
    var i;
    var j=d.MM_p.length;
    var a=MM_preloadImages.arguments; 
    for(i=0; i<a.length; i++)
	    if (a[i].indexOf("#")!=0)
	    { 
	    	d.MM_p[j]=new Image; 
	    	d.MM_p[j++].src=a[i];
	    }
  }
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function ccvPopup() {
            window.open('ccv-popup.html', 'ccvWin', 'width=440,height=400,scrollbars=1');
            return true;
}

  function defaultMessage(id, msg) {
    var i = document.getElementById(id);
    if(i) {
      i.onclick = function() { if(i.value == msg) { i.value = ""; } };
      i.onblur = function() { if(i.value == "") { i.value = msg } };
    }    
  }