function addEvent( obj, type, fn ) {
	if ( obj.attachEvent ) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
		obj.attachEvent( 'on'+type, obj[type+fn] );
	} else
		obj.addEventListener( type, fn, false );
}

function elementsToArray(elements) {
	
	var elements_ = new Array();
	for(var i = 0; i < elements.length; i++)
		elements_[elements_.length] = elements[i];
	return elements_;
	
}

function tour_go() {

	Shadowbox.open({
        player:     'iframe',
        title:      '',
        content:    'http://www.collectionstation.com/tools/tour',
        height:     500,
        width:      980,
		modal:		true
    });

}

function base64_encode( data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Bayron Guevara
    // +   improved by: Thunder.m
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
    // -    depends on: utf8_encode
    // *     example 1: base64_encode('Kevin van Zonneveld');
    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
 
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['atob'] == 'function') {
    //    return atob(data);
    //}
        
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, enc="", tmp_arr = [];
    data = utf8_encode(data);
    
    do { // pack three octets into four hexets
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);
 
        bits = o1<<16 | o2<<8 | o3;
 
        h1 = bits>>18 & 0x3f;
        h2 = bits>>12 & 0x3f;
        h3 = bits>>6 & 0x3f;
        h4 = bits & 0x3f;
 
        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);
    
    enc = tmp_arr.join('');
    
    switch( data.length % 3 ){
        case 1:
            enc = enc.slice(0, -2) + '==';
        break;
        case 2:
            enc = enc.slice(0, -1) + '=';
        break;
    }
 
    return enc;
}
function utf8_encode ( string ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    string = (string+'').replace(/\r\n/g,"\n");
    var utftext = "";
    var start, end;
    var stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc != null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }
 
    if (end > start) {
        utftext += string.substring(start, string.length);
    }
 
    return utftext;
}

function findElPos(el) {

	var left = 0;
	var top = 0;

	if(el.offsetParent) {

		while(el = el.offsetParent) {
			left += el.offsetLeft;
			top += el.offsetTop;
		}

	} else {
		left = el.offsetLeft;
		top = el.offsetTop;
	}

	return [left, top];

}

var months = new Array(
	'January', 
	'February',
	'March',
	'April',
	'May',
	'June',
	'July',
	'August',
	'September',
	'October',
	'November',
	'December'
);

var days = new Array(
	'Sunday',
	'Monday',
	'Tuesday',
	'Wednesday',
	'Thursday',
	'Friday',
	'Saturday'
);

function encodeAjaxParam(data, esc) {
	
	data = data.replace('&', '&amp;');
	data = data.replace('"', '&quot;');
	data = data.replace('\'', '&#039;');
	data = data.replace('<', '&lt;');
	data = data.replace('>', '&gt;');
	
	if(esc)
		data = escape(data);
		
	return data;
	
}
function is_array() {
	
	if(arguments.length == 0)
		return false;
	if(typeof(arguments[0].constructor) == 'undefined')
		return false;
	return arguments[0].constructor.toString().indexOf('Array()') > -1;
	
}
function prepareCategoryName(name) {
	
	name = name.replace(/[ ]+/g, '-');
	name = name.replace(/[^a-zA-Z0-9~%.:_-]+/g, '');
	name = name.replace(/--/g, '-');
	return name;
	
}
function decodeAjaxParam(data) {
	
	data = unescape(data);
	
	data = data.replace(new RegExp('&amp;', 'g'), '&');
	data = data.replace(new RegExp('&quot;', 'g'), '"');
	data = data.replace(new RegExp('&#039;', 'g'), '\'');
	data = data.replace(new RegExp('&lt;', 'g'), '<');
	data = data.replace(new RegExp('&gt;', 'g'), '>');
	
	if(arguments.length == 1)
		return decodeAjaxParam(data, true);
	else
		return data;
	
}
function Array_push() {
	for (var i = 0; i < arguments.length; i++)
		this[this.length] = arguments[i];
	return this.length
}
if (typeof Array.prototype.push == "undefined")
	Array.prototype.push = Array_push
	
function entity(str, mode) {
	str = (str) ? str : "";
	mode = (mode) ? mode : "string";

	var e = document.createElement("div");
	e.innerHTML = str;

	if (mode == "numeric") {
		return "&#" + e.innerHTML.charCodeAt(0) + ";";
	}
	else if (mode == "utf16") {
		var un = e.innerHTML.charCodeAt(0).toString(16);
		while (un.length < 4) un = "0" + un;
		return "\\u" + un;
	}
	else return e.innerHTML;
}

function getSessionImages(callBack) {
	
	doRequest(toolsPath, function(res) {
		if(!res.responseXML) {
			alert(res.responseText);
			return;
		}
		var doc = res.responseXML.documentElement;
		var images = doc.getElementsByTagName('image');
		if(images.length == 0) {
			callBack(new Array());
			return;
		}
		var output = new Array();
		for(var i = 0; i < images.length; i++) {
			var imageItem = new Array();
				imageItem['Name'] = images[i].getAttribute('name');
				imageItem['Size'] = images[i].getAttribute('size');
				imageItem['isMain'] = images[i].getAttribute('isMain');
				imageItem['TempThumb'] = images[i].getAttribute('thumb');
				imageItem['WriteProtected'] = (images[i].getAttribute('writeprotected') == 'true')
			output[output.length] = imageItem;
		}
		if(typeof(callBack) != 'undefined')
			callBack(output);
	});
	
}

Array.prototype.in_array = function(p_val) {
	for(var i = 0, l = this.length; i < l; i++) {
		if(this[i] == p_val) {
			return true;
		}
	}
	return false;
}
function getElementsByClassName(oElm, strTagName, strClassName) {
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
	
}
/*
function getElementsByClassName(oElm, strTagName, oClassNames){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	if(typeof oClassNames == "object"){
		for(var i=0; i<oClassNames.length; i++){
			arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));
		}
	}
	else{
		arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
	}
	var oElement;
	var bMatchesAll;
	for(var j=0; j<arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k=0; k<arrRegExpClassNames.length; k++){
			if(!arrRegExpClassNames[k].test(oElement.className)){
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}*/