/*@cc_on@*/

// Adapted from Dean Edwards' addEvent.
// written by Dean Edwards, 2005
// with input from Tino Zijdel, Matthias Miller, Diego Perini

// http://dean.edwards.name/weblog/2005/10/add-event/

var addEvent_guid = 0;
var addEvent_events = {};

function addEvent_helper(handlers, handler) {
	// assign each event handler a unique ID
	if (!handler.$$guid) handler.$$guid = ++addEvent_guid;

	// store the event handler in the hash table
	handlers[handler.$$guid] = handler;
}

function addEvent(element, type, handler) {
	// get event store for element
	var events = element.$$guid ?
		addEvent_events[element.$$guid] :
		(addEvent_events[element.$$guid = ++addEvent_guid] = {});
	
	// create a hash table of event handlers for each element/event pair
	var handlers = events[type];

	if (!handlers) {
		handlers = events[type] = {};
		
		// store the existing event handler (if there is one)
		if (element["on" + type]) addEvent_helper(handlers, element["on" + type]);

		// assign a global event handler to do all the work
		element["on" + type] = handleEvent;
	}
	
	// Finally add the handler
	addEvent_helper(handlers, handler);
};

function removeEvent(element, type, handler) {
	// delete the event handler from the hash table
	if (element.$$guid && addEvent_events[element.$$guid][type]) {
		delete addEvent_events[element.$$guid][type];
	}
};

function clearEvents(element, type) {
	if(element.$$guid) {
		for(var type in addEvent_events[element.$$guid]) {
			element["on" + type] = null;
		}
		delete addEvent_events[element.$$guid];
		delete element.$$guid;
	}
}

function handleEvent(event) {
	var returnValue = true;

	// grab the event object (IE uses a global event object)
	event = event || ((this.ownerDocument || this.document || this).parentWindow || window).event;

	// get a reference to the hash table of event handlers
	var handlers = addEvent_events[this.$$guid][event.type];

	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		try {
			if (this.$$handleEvent(event) === false) {
				returnValue = false;
			}	
		}
		finally {
			this.$$handleEvent = null;
		}
	}

	return returnValue;
};

/* get(selector)
 * Based on getElementsBySelector Version 0.4 - Simon Willison, March 25th 2003
 * Stripped down, refactored, and a bugfix.
 */

var getByTagName = function(elements, tagName) {
	var r = [];
	for(var i = 0, e; e = elements[i]; ++i) {
		var children = (tagName == '*' && e.all) ? e.all : e.getElementsByTagName(tagName);
		for(var j = 0, child; child = children[j]; ++j) {
			r[r.length] = child;
		}
	}
	
	return r;
};

// TODO: Check that element selected by id is a descendant of context.
var get = function(selector, context) {
	context = [context || document];
	var tokens = selector.split(/\s+/);
	for (var i = 0, token; token = tokens[i]; i++) {
		if(token.indexOf('#') > -1) {
			if(i != 0) throw 'The id must be at the start of the selector.';
			var bits = token.split('#'), tagName = bits[0], id = bits[1];
			var element = document.getElementById(id);
			if (!element || (tagName && element.nodeName.toLowerCase() != tagName))
				return [];
			context = [element];
		}
		else if (token.indexOf('.') > -1) {
			var bits = token.split('.'), tagName = bits[0] || '*', className = bits[1];
			var found = getByTagName(context, tagName);
			context = [];
			for (var k = 0, element; element = found[k]; k++) {
				if (element.className && element.className.match(new RegExp('(^| )'+className+'($| )'))) {
					context[context.length] = element;
				}
			}
		}
		else {
			context = getByTagName(context, token);
		}
	}
	return context;
};

// Suckerfish


function hover_onmouseover() { this.className += " hover"; }
function hover_onmouseout() { this.className = this.className.replace(new RegExp(" hover\\b"), ""); }

function setupHover(context) {
	var apply = get('.detect-hover', context);
	for(var i = 0; i < apply.length; ++i) {
		addEvent(apply[i], 'mouseover', hover_onmouseover);
		addEvent(apply[i], 'mouseout', hover_onmouseout);
	}
}

// Popup windows

function setupPopupWindows() {
	addEvent(document.body, 'click', function(event) {
		if (/*event.shiftKey ||*/ event.altKey || event.ctrlKey || event.metaKey || event.button == 1) return true;
		
		var element = event.target || event.srcElement;
		while(element) {
			if(element.nodeName.toLowerCase() == 'a')
				break;
			element = element.parentNode;
		}

		if(!element || element.target != '_blank') return;
		
		var href = element.href;

		if(/(\/|^)galleries\//.test(href)) {
			return openLink(href, 650, 700, 'galleries_window');
		}
		else if(/(\/|^)200[0-9]\//.test(href)) {
			return;
		}
		else {
			return openLink(href, 660, 440, 'sections_window');
		}
	});
	
	var windows = {};
	
	function openLink(href, width, height, name) {
		var params =
			'width='+ width + ',height=' + height +
			',status=no,directories=no';		

		// TODO: Maybe all browsers but Safari should use the first
		// alternative.
/*@if(true)
		if(!windows[name] || windows[name].closed) {
			windows[name] = window.open(href, '_blank', params);
		}
		else {
			windows[name].open(href, '_self');
			windows[name].focus();
		}
@else @*/
		window.open(href, name, params).focus();
//@end

		return false;
	}
}

function setupDotsScroll() {
	var toScroll = get('.dots_scroll');
	for(var i = 0, el; el = toScroll[i]; ++i) {
		var dots = get('.dots', el);
		var images = get('.images', el);
		if(dots.length != 1 || images.length != 1) continue;
		dots = dots[0]; images = images[0];
		var selected = get('.selected', dots);
		if(selected.length != 1) continue;
		selected = selected[0];
		
		var width = images.offsetWidth;
		var last_offset = 0, potential_offset = 0;
		var offsets = [0];
		
		var items = get('li', images);
		for(var j = 0, li; li = items[j]; ++j) {
			//if((li.offsetLeft + li.offsetWidth) > (images.offsetLeft + images.offsetWidth + last_offset)) {
			if(potential_offset > last_offset) {
				offsets[offsets.length] = potential_offset;
				last_offset = potential_offset;
			}
			

			potential_offset = li.offsetLeft + li.offsetWidth - images.offsetLeft;
		}
		
        dots.style.height = "20px";
		dots.style.width = (20 * offsets.length) + "px";
        selected.style.height = "20px";
        selected.style.width = "20px";
		
		dotsImplementation(dots, images, selected, offsets);
	}
}

function dotsImplementation(dots, images, selected, offsets) {
	addEvent(dots, 'click', function(event) {
		event = event || window.event;

		var x = typeof(event.pageX) === "number" ? event.pageX
			: (event.clientX + document.body.scrollLeft + (document.documentElement.scrollLeft || 0));
		for(var parent = this; parent; parent = parent.offsetParent)
			x -= parent.offsetLeft;

		x = (x / 20) << 0;
		images.scrollLeft = offsets[x];
		selected.style.marginLeft = (x * 20) + "px";
	});
}

function getPosition(e) {
    var cursor = {x:0, y:0};
    if (e.pageX || e.pageY) {
        cursor.x = e.pageX;
        cursor.y = e.pageY;
    } 
    else {
        var de = document.documentElement;
        var b = document.body;
        cursor.x = e.clientX + 
            (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
        cursor.y = e.clientY + 
            (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
    }
    return cursor;
}

function setupAutoScroll() {
	var toScroll = get('.auto_scroll');
	for(var i = 0, el; el = toScroll[i]; ++i) {
		var images = get('.images', el);
		var ul = get('ul', el);
		if(images.length != 1 && ul.length != 1) continue;
		ul = ul[0]; images = images[0];
		var lis = get('li', ul);
		var width = 0;
		for(var j = 0, li; li = lis[j]; ++j) {
			var x = li.offsetLeft + li.offsetWidth - ul.offsetLeft
			if(x > width) width = x;
		}
		
		// TODO: Hard-coded 10:
		ul.style.width = (width * 2 + 10) + "px";

		ul.innerHTML += ul.innerHTML;

		setupTicker();
		intervalElements.autoscroll[intervalElements.autoscroll.length] = { element : images, width : width };
	}
}

function autoScrollImpl(images, width) {
	setInterval(
		function() {
			var pos = images.scrollLeft;
			pos += 1;
			if(pos >= width) pos -= width;
			images.scrollLeft = pos;
		}, 20);
}

function setupTicker() {
	var toScroll = get('.ticker');
	if(toScroll.length != 1) return;
	setupInterval();
	intervalElements.ticker = toScroll[0];
	intervalElements.tickerPos = 0;
}

var intervalElements = {autoscroll : []};

function setupInterval() {
	setInterval("interval()", 20);
	setupInterval = function() {}
}

function interval() {
	if(intervalElements.ticker) {
		intervalElements.ticker.style.backgroundPosition = (intervalElements.tickerPos -= 2) + "px 0px";
	}
	
	if(intervalElements.autoscroll) {
		for(var i = 0, el; el = intervalElements.autoscroll[i]; ++i) {
			var pos = el.element.scrollLeft;
			pos += 1;
			if(pos >= el.width) pos -= el.width;
			el.element.scrollLeft = pos;
		}
	}
}

// Call everything on load:

addEvent(window, 'load', function() {
	removeEvent(window, 'load', arguments.callee);

	/*@if(@_jscript_version <= 5.6) setupHover(); @end @*/
	/*@if(!(@_win16 || @_win32) || @_jscript_version > 5.5) @*/	setupPopupWindows(); /*@end @*/
	setupDotsScroll();
	/*@if(@_jscript_version >= 5.6) @*/ setupAutoScroll(); /*@end @*/
	setupTicker();
});

