function $(id) {
	return document.getElementById(id);
}

function $$(obj, tagName) {
	return obj.getElementsByTagName(tagName);
}


function extend (ob1, ob2) {
	return (function (object) {
		for (var property in object) {
			this[property] = object[property];
		}
		return this;
	}).apply(ob1, [ob2]);
}

extend (Object, {
	Class: {
		find: function (obj, className) {
			var re = new RegExp('(^|\\s)' + className + '($|\\s)');
			return re.test(obj.className);
		},
		add: function (obj, a){
			if (!this.find(obj, a)){
				obj.className += (obj.className === '') ? a : ' ' + a;
			}
		},
		replace: function (obj, a, b, direction){
			if (direction) {
				var c = b, b = a, a = c;
			}
			if (this.find(obj, a)){
				obj.className = (obj.className.replace(new RegExp('(^|\\s+)(' + a + '|' + b + ')($|\\s+)', 'g'), '$1') + ' ' + b).replace(/^\s+/,'');
			} else {
				this.add(obj, b);
			}
		}
	},
	copyParams: function (obj, params) {
		for (var z in params) {
			obj[z] = params[z];
		}
	},
	array: function (iterable) {
		if (!iterable) { return []; }
		if (iterable.toArray) { return iterable.toArray(); }
		var length = iterable.length, results = [length];
		while (length--) {
				results[length] = iterable[length];
		}
		return results;
	}
});

extend (Function.prototype, {
	bind: function () {
		if (arguments.length < 2 && arguments[0] === undefined) { return this; }
		var __method = this, args = Object.array(arguments), object = args.shift();
		return function () {
			return __method.apply(object, args.concat(Object.array(arguments)));
		};
	},
	bindAsEventListener: function() {
		var __method = this, args = Object.array(arguments), object = args.shift();
		return function (event) {
		  return __method.apply(object, [event || window.event].concat(args));
		};
	}
});

var Event = {
	add: function (obj, sEvent, fnHandler) {
		if (obj.addEventListener) {
			obj.addEventListener(sEvent, fnHandler, false);
		} else {
			obj.attachEvent('on' + sEvent, fnHandler);
		}
	},
	remove: function (obj, sEvent, fnHandler) {
		if (obj.removeEventListener) {
			obj.removeEventListener(sEvent, fnHandler, false);
		} else {
			obj.detachEvent('on' + sEvent, fnHandler);
		}
	},
	element: function (e) {
		if (!e) { e = window.event; }
		if (!e) { return false; }
		return e.target || e.srcElement;
	},
	elementEqual: function (e, tag) {
		this.cancelEvent(e);
		e = this.element(e);
		return e.tagName == tag ? e : false;
	},
	cancelEvent: function (e) {
		return e.preventDefault ? e.preventDefault() : e.returnValue = false;
	}
};

/* ajax */
var Ajax = function (object, objParams) {
	Object.copyParams(this, object);
	Object.copyParams(this, objParams);
	if (this.init) {
		this.init.bind(this)();
	}

	return this;
};

Ajax.prototype = {
	go: function (data) {
		this.getTransport();
		if (!this.nospinner) {
			this.spinnerSH(1);
		}
		this.transport.open(this.method || 'GET', this.url, true);
		if (this.method == 'POST') {
			this.transport.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		} else {
			this.transport.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
		}
		this.transport.send(data || null);
		this.readyListener();
	},
	getTransport: function () {
		this.transport = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : (window.XMLHttpRequest ? new XMLHttpRequest() : false);
	},
	spinnerSH: function (show) {
		Object.Class.replace(this.spinner, 'visible', '', show);
	},
	readyListener: function () {
		var Responder = this.transport;
		Responder.onreadystatechange = function () {
			if (Responder && Responder.readyState == 4 && Responder.status == 200) {
				eval(Responder.responseText);
				this.after.bind(this)(response);
			}
		}.bind(this);
	}
};

var RubricAJAX = {
	init: function () {
		Event.add(this.list_container, 'click', this.run.bind(this));
	},
	run: function (e) {
		e = Event.elementEqual(e, 'A');
		if (!e) { return false; }

		var url = e.href.match(/\/[^\/]+\/$/)[0];
		if (url == this.currentURL) { return; }

		for (var i = 0, l = this.listsArray.length; i < l; i++) {
			var a_links = $$(this.listsArray[i], 'A');
			for (var k = 0, ll = a_links.length; k < ll; k++) {
				var link = a_links[k];
				link.parentNode.className = (link.href == e.href) ? 'orng' : '';
			}
		}

		this.currentURL = url;
		this.url = url + 'index.json?view=rubric';
		this.go();
	},
	after: function (response) {
		if (response.url != this.currentURL) { return; }
		this.spinnerSH(0);
		this.t_container.innerHTML = response.title;
		this.container.innerHTML = response.html;
		this.link_container.href = response.url_all;
	}
};


/* other */
function switchActions (e, o) {
	e = Event.element(e);
	if (o) { e = o; }
	if (!e || e.tagName != 'LI') { return; }

	var id = e.className.match(/([^ ]+)/)[1];

	var oElement = $(id);

	if (typeof(hVisibleAction) == 'undefined') {
		hVisibleAction = {
			id: '',
			item: ''
		};
	}

	var current = (id == hVisibleAction.id);

	Object.Class.replace(hVisibleAction.item, '', 'visible', current);


	if (current) {
		Object.Class.replace($(hVisibleAction.id), 'visible', '');
	} else {
		Object.Class.add(e, 'visible');
		Object.Class.add(oElement, 'visible');
		if (hVisibleAction.item) {
			Object.Class.replace($(hVisibleAction.id), 'visible', '');
			Object.Class.replace(hVisibleAction.item, 'visible', '');
		}

	}

	hVisibleAction.id = current ? '' : id;
	hVisibleAction.item = current ? '' : e;
}


function switchMedia (e, c) {
	e = Event.element(e);

	if (!e || e.tagName != 'LI' || Object.Class.find(e, 'active') || e.href) { return; }

	var filters = $$(e.parentNode, 'LI');

	for (var i = 0, l = filters.length; i < l; i++) {
		Object.Class.replace(filters[i], 'active', '');
	}

	var sHiddenListID = e.className.replace(/\s/g, '');
	if (c) {
		carousel_media.switchMediaType(sHiddenListID);
	} else {
		c = $('media_container');
		sHiddenListID = 'r_m_hidden_' + sHiddenListID;
		if ($(sHiddenListID)) {
			c.innerHTML = $(sHiddenListID).innerHTML;
		}
	}
	Object.Class.add(e, 'active');
}

function switchFilters (e) {
	e = Event.elementEqual(e, 'SPAN');
	if (!e || Object.Class.find(e.parentNode, 'active')) { return; }

	for (var i = 0, l = aFilters.length; i < l; i++) {
		aFilters[i].className = '';
	}

	Object.Class.add(e.parentNode, 'active');

	var sCurrentFilter = e.id.match(/f_(\w+)/)[1];

	for (i = 0, l = aList.length; i < l; i++) {
		var article = aList[i];
		var sClassName = article.className.match(/a_(\w+)/)[1];
		Object.Class.replace(article, 'invisible', '', (sCurrentFilter != 'all' && sClassName != 'all' && sClassName != sCurrentFilter));
	}
}

function switchImportFilters (e) {
	e = Event.elementEqual(e, 'SPAN');
	if (!e || Object.Class.find(e.parentNode, 'active')) { return; }

	for (var i = 0, l = aFilters.length; i < l; i++) {
		aFilters[i].className = '';
	}

	Object.Class.add(e.parentNode, 'active');

	var aULs = $$(oContainer, 'UL');
	for (i = 0, l = aULs.length; i < l; i++) {
		var ul = aULs[i];
		if (Object.Class.find(ul, 'list')) {
			Object.Class.add(ul, 'invisible');
		}
	}

	var sCurrentFilter = e.id.match(/f_(\w+)/)[1];
	Object.Class.replace($('imp_' + sCurrentFilter), 'invisible', '');
}

function victorinaCheckSelected (e) {
	if (e) {
		e = Event.element(e);
		if (e.tagName == 'IMG') {
			e.parentNode.nextSibling.checked = true;
		}
	}

	var submit = $('form_submit');
	if (!submit.disabled) { return; }
	
	var aInputs = $$($('form_answers'), 'INPUT');
	for (var i = 0, l = aInputs.length; i < l; i++) {
		if (aInputs[i].checked) {
			submit.disabled = false;
			break;
		}
	}
}


function setCookie(name, value, expires, path, domain, secure) {
      document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function getCookie(name) {
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) {
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	return(setStr);
}