function string_escapeString(str)
{
	var exp = /\"/g;
	return str.replace(exp, "'");
}

function setCookie(name, value, expire) {
    if (expire==-1) {
        expire=new Date(); // gets today's date
        expire.setTime(expire.getTime() + 365*24*60*60*1000);
    }
    var cook = name + '=' + escape(value) +
        ((expire == null) ? '' : ('; expires=' + expire.toGMTString()));
    document.cookie = cook;
}

function getRawCookie(name)
{
	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 null;
}

function setMultiCookie(name, value) // no expiration
{ 
	var cook = '';
	var sep = ',';

	var _cook = getRawCookie('multi');
	if (_cook) {
		ca = _cook.split(sep);
		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(name + '=') != 0) {
				cook += c + sep;
			}
		}		
	}
	cook += name + '=' +escape(value);
	document.cookie = 'multi='+cook;	
}

function getMultiCookie(name)
{
	var nameEQ = name + '=';
	var sep = ',';
	var _cook = getRawCookie('multi');
	if (_cook) {
		ca = _cook.split(sep);
		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 '';
}

function getFirstElementByType(node, type) {
    var children = node.childNodes;
    if (!children) return null;
    for (var i=0; i<children.length; i++) {
        var child = children[i];
        if (child.nodeType==type) return child;
    }
    return null;
}

function getFirstElementByAttributeValue(node, attrName, attrValue, recurse) {
    var children = node.childNodes;
    for (var i=0; i<children.length; i++) {
        var child = children[i];
        if (child.getAttribute && child.getAttribute(attrName)==attrValue) return child;
        if (recurse && child.childNodes && child.childNodes.length>0) {
            child = getFirstElementByAttributeValue(child, attrName, attrValue, recurse);
            if (child!=null) return child;
        }
    }
    return null;
}

function getAllElementsByAttributeValue(node, attrName, attrValue, recurse, list) {
    if (!list) list = Array();
    var children = node.childNodes;
    for (var i=0; i<children.length; i++) {
        var child = children[i];
        if (child.getAttribute && child.getAttribute(attrName)==attrValue) list[list.length] = child;
        if (recurse && child.childNodes && child.childNodes.length>0) {
            getAllElementsByAttributeValue(child, attrName, attrValue, recurse, list);
        }
    }
    return list;
}

function getFirstElementByTagName(node, tagName, recurse) {
    tagName = tagName.toLowerCase();
    var children = node.childNodes;
    for (var i=0; i<children.length; i++) {
        var child = children[i];
        if (child.tagName.toLowerCase() == tagName) return child;
        if (recurse && child.childNodes && child.childNodes.length>0) {
            child = getFirstElementByTagName(child, attrName, attrValue, recurse);
            if (child) return child;
        }
    }
    return null;
}

function findNodeWithMemberUp(node, member) {
    if (node[member]) return node;
    if (!node.parentNode) return null;
    return findNodeWithMemberUp(node.parentNode, member);
}

function findNodeWithAttributeUp(node, attrName, attrValue, member) {
    var target = null;
    if (node["getAttribute"] && node.getAttribute(attrName)==attrValue) target = node;
    if (target && member) {
        if (!target[member]) target = null;
    }
    if (target) return target;
    if (!node.parentNode) return null;
    return findNodeWithAttributeUp(node.parentNode, attrName, attrValue, member);
}

function getCRCNodeForEvent(evt, nodeType) {
    evt = fix_e(evt);
    var target = evt.currentTarget;
    if (nodeType) target = findNodeWithAttributeUp((target ? target : evt.target), "dtType", nodeType, "parentCtrl");
    else if (target==null || !target["parentCtrl"]) target = findNodeWithMemberUp(evt.target, "parentCtrl");
    if (!target || !target["parentCtrl"]) return;
    return target;
}

function setClassNameWithAppend(elem, name) {
    var append;
    if (elem["getAttribute"] && (append=elem.getAttribute("dtClassNameAppend"))) elem.className = (name ? name + " " : "") + append;
    else if (name) elem.className = name;
}

//==============================================================================
// Taken from aaron boodman's labels.js file.
// Thanks Aaron, great work!
// aaron boodman aaron@youngpup.net www.youngpup.net
//==============================================================================

// scott andrew (www.scottandrew.com) wrote this function. thanks, scott!
// adds an eventListener for browsers which support it.
function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, true);
    return true;
  } else if (obj.attachEvent){
	var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
	return false;
  }
}
function removeEvent(obj, evType, fn){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, true);
    return true;
  } else if (obj.dettachEvent){
	var r = obj.dettachEvent("on"+evType, fn);
    return r;
  } else {
	return false;
  }
}

// add a style rule in ie or dom
function addStyleRule(stylesheet, selector, rule) {
	if (stylesheet.addRule) stylesheet.addRule(selector, rule);
	else {
		var index = stylesheet.cssRules.length;
		stylesheet.insertRule(selector + "{" + rule + "}", index);
	}
}

// makes ie behave like a sc browser with regard to events
function fix_e(e) {
	if (!e && window.event) e = window.event;
	if (!e.target && e.srcElement) e.target = e.srcElement;
	if (!e.currentTarget && e.srcElement) e.currentTarget = e.srcElement;
	if (!e.originalTarget && e.srcElement) e.originalTarget = e.srcElement;
	return e;
}

