var _eventHandlers = {};
var _timerHandlers = {};
var _eventStepTime = 30;
var _eventStepPos  = 20;
var _eventStepMin  = 0.02;

/*
var drag_init = function (p_object) {
	p_object.className += " item";
	
	$(p_object).mousedown( function (e) { drag_start(e, this); } );
};
var drag_start = function (e, p_object) {
	var element = document.getElementById("drag-ghost");
	var ghost = p_object.cloneNode(true);
	
	if (!element) {
		element = document.createElement('div');
		element.style.position = "absolute";
		element.id = "drag-ghost";
	}
	
	element.innerHTML = "";
	element.appendChild(ghost);
	$("#menu-list").prototype.appendChild(element);	
	
	$("#drag-ghost").offset({top: e.pageY - 5, left: e.pageX - 5});
	$("#menu-list").mousemove( function (e) {
		$("#drag-ghost").offset({top: e.pageY - 5, left: e.pageX - 5});
	} );
	$("#drag-ghost").mouseup( function (e) {
		drag_stop(e, this);
	} );
};
var drag_stop = function (e, p_object) {
	$("#menu-list").unbind( "mousemove" );
};
*/

var load_event = function (p_object, func) {
	var oldonload = window.onload; 
	if (typeof window.onload != 'function') { 
		window.onload = func; 
	} else { 
		window.onload = function() { 
			if (oldonload) { 
				oldonload(); 
			} 
			func(); 
		};
	}
};

var mouse_move = function (p_object, p_event) {
	event_bind(p_object, p_event, "mousemove");
};
var mouse_over = function (p_object, p_event) {
	event_bind(p_object, p_event, "mouseover");
};
var mouse_out = function (p_object, p_event) {
	event_bind(p_object, p_event, "mouseout");
};
var mouse_down = function (p_object, p_event) {
	event_bind(p_object, p_event, "mousedown");
};
var mouse_up = function (p_object, p_event) {
	event_bind(p_object, p_event, "mouseup");
};
var mouse_click = function (p_object, p_event) {
	event_unbind(p_object, "click");
	event_bind(p_object, p_event, "click");
};
var mouse_focus = function (p_object, p_event) {
	event_unbind(p_object, "focus");
	event_bind(p_object, p_event, "focus");
};
var mouse_blur = function (p_object, p_event) {
	event_unbind(p_object, "blur");
	event_bind(p_object, p_event, "blur");
};

var event_bind = function (p_object, p_event, p_type) {
	if (p_object.addEventListener) {
		p_object.addEventListener(p_type, p_event, true);
	} else if (p_object.attachEvent) {
		p_type = "on" + p_type;
		if (p_type == "onfocus") p_type = p_type = "onfocusin";
		if (p_type == "onblur") p_type = p_type = "onfocusout";
		p_object.attachEvent(p_type, p_event);
	}
	
	event_bindtoarray(p_object, p_type, p_event);
};
var event_bindtoarray = function (p_object, p_type, p_event) {
	if (!(p_object in _eventHandlers)) {
		_eventHandlers[p_object] = {};
	}
	if (!(p_object in _eventHandlers[p_object])) {
		_eventHandlers[p_object][p_type] = [];
	}
	_eventHandlers[p_object][p_type].push([p_event]);
};
var event_unbind = function (p_object, p_type) {
	if (p_object in _eventHandlers) {
		if (p_type in _eventHandlers[p_object]) {
			for (var x = _eventHandlers[p_object][p_type].length; x--;) {
				if (typeof p_type == "string" && p_type.substr(0,5) == "timer") {
					clearTimeout(_eventHandlers[p_object][p_type][x][0]);
				} else {
					if (p_object.removeEventListener) {
						p_object.removeEventListener(p_type, _eventHandlers[p_object][p_type][x][0], true);
					} else if (p_object.detachEvent) {
						p_object.detachEvent(p_type, _eventHandlers[p_object][p_type][x][0]);
					}
				}
			}
			return _eventHandlers[p_object][p_type][0];
		}
	}
};
var find_object = function (p_object, p_type) {
	return $(p_type, p_object);
};

var class_add = function (p_object, p_class) {
	if (!class_has(p_object, p_class)) {
		p_object.className += (p_object.className ? ' ' : '') + p_class;
	}
	return true;
};
var class_remove = function (p_object, p_class) {	
	if (class_has(p_object, p_class)) {
		p_object.className = p_object.className.replace(new RegExp('(\\s|^)' + p_class + '(\\s|$)'),' ').replace(/^\s+|\s+$/g, '');
	}
	return true;
};
var class_has = function (p_object, p_class) {
	if (!p_object) return true;
	if (p_object.className.length > 0) {
		return new RegExp('(\\s|^)' + p_class + '(\\s|$)').test(p_object.className);
	}
	return false;
};
var css_add = function (p_object, p_css) {
	var target;
	
	switch(p_css[0]) {
		case "display": 
			target = p_object.style.display;
			if (p_css[1]) p_object.style.display = p_css[1]; return true;
			break;
		case "width":
			target = p_object.style.width;
			if (p_css[1]) p_object.style.width = p_css[1] + "px"; return true;
			break;
		case "left":
			target = p_object.style.left;
			if (p_css[1]) p_object.style.left = p_css[1] + "px"; return true;
			break;
		case "background":
			target = p_object.style.background;
			if (p_css[1]) p_object.style.background = p_css[1]; return true;
			break;
	}

	if (target) return target;
	return false;
};
var css_mod = function (p_object, p_css) {
	p_object = p_css; 
};

var list_init = function (p_object, p_event, p_parent) {
	$(p_object).find("*:first").mouseover( function (e) {
		$(p_object).addClass("over");
	});
	$(p_object).find("*:first").mouseout( function (e) {
		$(p_object).removeClass("over");
	});
	$(p_object).mouseover( function (e) {
		$(p_object).addClass("over");
	});
	$(p_object).mouseout( function (e) {
		$(p_object).removeClass("over");
	});
	$(p_object).click( function (e) {
		p_parent.list_selected = this;
	});
};

var tabs_init = function (p_object, p_event, p_parent) {
	var control_parent;
	var control_controls;
	
	if (!$("#tabs-controler-parent")) {
		control_parent = document.createElement("div");
		control_controls = document.createElement("div");
		control_parent.id = "tabs-controler-parent";
		control_controls.id = "tabs-controler-controls";
		
		$(p_object).parent().prototype.appendChild(control_parent);
		control_parent.appendChild(control_controls);
	} else {
		control_parent = $("#tabs-controler-parent").prototype;
		control_controls = $("#tabs-controler-controls").prototype;
	}
	
	var control_selector = document.createElement("div");
	var count;
	
	if ($(".tab-controller")) {
		count = $(".tab-controller").count();
	} else {
		count = 0;
	}
	
	control_selector.className = "tab-controller";
	control_selector.innerHTML = "<a href=\"#\" onclick=\"switch_tabs(event," + count + ")\">" + (count + 1) + "</a>"; 

	control_parent.appendChild($(p_object).prototype);
	control_controls.appendChild(control_selector);

};

var position_type = function(p_object, p_string) {
	p_object.style.position = "absolute";
};
var position_top = function(p_object, p_string) {
	p_object.style.top = p_string + "px";
};
var position_left = function(p_object, p_string) {
	p_object.style.left = p_string + "px";
};

var element_parent = function(p_object) {
	return $(p_object.parentNode);
};
var element_offset = function(p_object, p_options) {
	if (!p_options) {
		return {
			top: p_object.offsetTop,
			left: p_object.offsetLeft,
			width: p_object.offsetWidth,
			height: p_object.offsetHeight
		};
	} else {
		p_options.width;
		
		for (att in p_options) {
			switch(att) {
				case "width":
					$(p_object).css("width", p_options[att]);
					break;
				case "left":
					$(p_object).css("left", p_options[att]);
					break;
			}
		}
	}
};
var element_clone = function(p_object) {
	return p_object.cloneNode(true);
};
var element_each = function(p_object, p_options) {
	//alert(p_object);
	//p_options($(p_object));
	p_options(p_object);
	//p_object.p_options;
};

var animation_scroll = function(p_object, p_options) {
	animation_setPosition(p_object, p_options, $(p_object).offset());
};
var animation_control = function(p_id, p_max, p_parentID){
	var html_control = document.createElement("li");
	html_control.innerHTML = "<a href=\"#\" onclick=\"javascript:set_slideshow(event, '" + p_parentID + "', " + p_id + ")\"><img src=\"../images/pixel.gif\" alt=\"\" width=\"1\" height=\"1\" /></a>";
	return html_control;
};
var animation_slideshow = function(p_object, p_options) {
	var clone = $(p_object).find("*:first");
	var width = clone.offset().width;
	var animate = true;
	var startslideshow = true;

	if (!clone.prototype.getAttribute("refid")) {
		var elements = $(p_object).find("*:siblings").prototype;
		var html_wrapper   = document.createElement("div");
		var html_container = document.createElement("ul");
		for(var x = 0; x < elements.length; x ++) {
			elements[x].setAttribute("refid", (x+1));
			html_container.appendChild( animation_control((x+1), elements.length, $(p_object).prototype.id) );
			if (x > 0) $(p_object).prototype.insertBefore( elements[x], elements[x-1] );
		}
		if (!$(p_object).parent().find(".slide-show-controls")) {
			html_wrapper.className = "slide-show-controls";
			html_wrapper.appendChild(html_container);
			$(p_object).parent().prototype.appendChild(html_wrapper);
		}

		$(p_object).parent().mouseover( function() {
			event_unbind(p_object, "timer_slideshow");
		});
		$(p_object).parent().mouseout( function() {
			timer = setTimeout ( function () {
				animation_slideshow(p_object, p_options);
			}, p_options.delay);
			event_bindtoarray(p_object, "timer_slideshow", timer);
		});
		animate = false;
		p_object.style.visibility = "visible";
	}
	
	if (p_options && p_options.find) {
		var controls = $(p_object).parent().find(".slide-show-controls").find("li");
		if ($(p_object).find("*:first").prototype.getAttribute("refid") != p_options.find) {
			var elements = $(p_object).find("*:siblings").prototype;
			for(var x = 0; x < elements.length; x ++) {
				$(controls.prototype[x]).removeClass("selected");
				if (elements[x].getAttribute("refid") == p_options.find) {
					$(p_object).prototype.insertBefore( elements[x], elements[0] );
					break;
				}
			}
			for (var no = x; no < elements.length; no++) {
				$(controls.prototype[no]).removeClass("selected");
			}
			p_options.find = null;
			startslideshow = false;
		} else {
			animate = false;
			startslideshow = false;
		}
	} else {
		var elements = $(p_object).find("*:siblings").prototype;
		var cur = elements[0].getAttribute("refid");
		var controls = $(p_object).parent().find(".slide-show-controls").find("li");

		$(controls.prototype[0]).removeClass("selected");
		for(var x = 1; x < elements.length; x ++) {
			$(controls.prototype[x]).removeClass("selected");
			cur = cur - 1;
			if (cur < 1) cur = elements.length;
			for (var no = (x + 1); no < elements.length; no ++) {
				if (elements[no].getAttribute("refid") == cur) break;
			}
			if (no < elements.length) p_object.insertBefore( elements[no], elements[x] );
		}
		$(p_object).prototype.insertBefore( $(p_object).find("*:last").prototype, $(p_object).find("*:first").prototype );
	}
	
	cur = $(p_object).find("*:first").prototype.getAttribute("refid");
	$(controls.prototype[cur - 1]).addClass("selected");
	
	if (animate) {
		width = $(p_object).find("*:first").offset().width;
		$(p_object).offset( { left: -(width) } );
		animation_scroll(p_object, { duration: width } );
	}
	if (startslideshow) {
		event_unbind(p_object, "timer_slideshow");
		timer = setTimeout ( function () {
			animation_slideshow(p_object, p_options);
		}, p_options.delay);
		event_bindtoarray(p_object, "timer_slideshow", timer);
	}
};
var animation_setPosition = function(p_object, p_options, p_ref) {
	var target = p_options.duration * 1;
	var timer;

	if (typeof p_duration == "string" && p_options.duration.substr(p_options.duration.length-2) == "px") target = p_options.duration.substr(0, p_options.duration.length-2) * 1;

	if ($(p_object).offset().left < (p_ref.left + target)) {
		var pos = p_object.style.left;
		if (pos.length > 2) pos = pos.substr(0, pos.length - 2) * 1;

		tween = 1 - (((pos - p_ref.left) + 1) / target);
		if (tween < _eventStepMin) tween = _eventStepMin;
		pos += _eventStepPos * (tween * 1.8);

		p_object.style.left = pos + "px";
		timer = setTimeout ( function () {
			animation_setPosition(p_object, p_options, p_ref);
		}, _eventStepTime);
		
		event_unbind(p_object, "timer_position");
		event_bindtoarray(p_object, "timer_position", timer);
	} else {
		/* 0.02 is for IE 8 fix */
		p_object.style.left = ((p_ref.left + target) - 0.02) + "px";
		event_unbind(p_object, "timer_position");
	}
};



function associate_function(p_function, p_object, p_event, p_return) {
	var value;
	
	if (p_object.prototype && p_object.prototype.length) {
		for (var x = 0; x < p_object.prototype.length; x++) {
			value = p_function(p_object.prototype[x], p_event, p_object);
		}
	} else {
		value = p_function(p_object.prototype, p_event, p_object);
	}
	
	if (p_return) return value;
}

function object (p_object) {
	this.id = uniqueID();
	this.prototype = p_object;	
	this.name = "";
	this.dragable = false;
	this.list_selected = -1;

	this.parent = function (e) { return associate_function(element_parent, this, e, true ); };
	this.offset = function (_options) { return associate_function(element_offset, this, _options, true); };
	this.clone  = function (e) { return associate_function(element_clone, this, e, true); };
	this.find	= function (_type) { return associate_function(find_object, this, _type, true); };
	this.count	= function (e) { return this.prototype.length; };
	this.each	= function (e, obj) { associate_function(element_each, this, e); };
		
	this.css = function (_style, _option) { return associate_function(css_add, this, [_style, _option], true); };
	this.addClass = function (_class) { associate_function(class_add, this, _class); };
	this.removeClass = function (_class) { associate_function(class_remove, this, _class); };
	this.hasClass = function (_class) { return associate_function(class_has, this, _class, true); };
	this.scrollTo = function (_option) { associate_function(animation_scroll, this, _option); };
	this.slideShow = function (_option) { associate_function(animation_slideshow, this, _option); };
			
	this.mousemove = function (e, obj) {
		associate_function(mouse_move, this, e);
		return e;
	};
	this.mouseover = function (e, obj) {
		associate_function(mouse_over, this, e);
		return e;
	};
	this.mouseout = function (e, obj) {
		associate_function(mouse_out, this, e);
		return e;
	};
	this.mousedown = function (e, obj) {
		associate_function(mouse_down, this, e);
		return e;
	};
	this.mouseup = function (e, obj) {
		associate_function(mouse_up, this, e);
		return e;
	};
	this.click = function (e, obj) {
		associate_function(mouse_click, this, e);
		return e;
	};
	this.focus = function (e, obj) {
		associate_function(mouse_focus, this, e);
		return e;
	};
	this.blur = function (e, obj) {
		associate_function(mouse_blur, this, e);
		return e;
	};
	this.unbind = function (e, obj) { associate_function(event_unbind, this, e); };
	
	/*
	this.offset = function (parameters) {
		if (parameters) {
			associate_function( position_type, this, "absolute" );
			associate_function( position_top, this, parameters.top );
			associate_function( position_left, this, parameters.left );
		} else {
			return { top: 0, left: 0 };
		}
	};
	*/
	this.onload = function (e) { associate_function(load_event, this, e); };

	this.list = function (e, selected) {
		if (!selected) selected = -1;
		selected = associate_function(list_init, this, selected, true);
	};
	this.tabs = function (e, selected) {
		if (!selected) selected = -1;
		selected = associate_function(tabs_init, this, selected, true);
	};
	//this.list = function () { associate_function(drag_init, this); };
}

function $ (parameter, parent) {
	if (!parent) parent = document;
	
	if (typeof parameter == "string") {
		var param = parameter.split(":");
		var name = param[0];
		var option = param[1];
		var type = param[2];
		
		if (typeof parameter == "string") {
			switch(name.substr(0,1)) {
				case ".":
					var hasClassName = new RegExp("(?:^|\\s)" + name.substr(1) + "(?:$|\\s)");
					var allElements = parent.getElementsByTagName("*");
					var results = [];
					var element;
					
					for (var i = 0; (element = allElements[i]) != null; i++) {
						var elementClass = element.className;
						if (elementClass && elementClass.indexOf(name.substr(1)) != -1 && hasClassName.test(elementClass))
							results.push(element);
					}
					if (results.length == 0) return false;
					my_object = results;
					break;
				case "#":
					my_object = parent.getElementById(name.substr(1));
					break;
				default:
					my_object = parent.getElementsByTagName(name);
					break;
			}
			switch(option) {
				case "first":
						my_object = getChilds(my_object);
						my_object = my_object[0];
					break;
				case "last":
						my_object = getChilds(my_object);
						my_object = my_object[my_object.length - 1];
					break;
				case "siblings":
						my_object = getChilds(my_object);
					break;
			}
		} else {
			my_object = parameter;
		}
		if (my_object != null) {
			return new object(my_object);
		} else {
			return false;
		}
	} else {
		if (parameter && parameter.type && parameter.nodeName != "INPUT") {
			my_object = parameter.target || parameter.srcElement;
		} else {
			my_object = parameter;
			if (!my_object) {
				my_object = window.event.target || window.event.srcElement;
			}
		}

		if (!my_object || !my_object.prototype) return new object(my_object);
	}
	
	return my_object;
}

function cancelevent(e)
{
	var event = e || window.event;
	
	if (event.stopPropagation) {
		event.preventDefault();
		event.stopPropagation();
		event.stopped = true;
		return false;
	} else {
		event.cancelBubble = true;
		event.returnValue = false;
		return false;
	}
	
	return true;
}


function getChilds(p_parent)
{
	var t_object = [];
	var sibling = p_parent[0];

	while (sibling) {
		if (sibling && sibling.nodeName == p_parent[0].nodeName) {
			t_object.push(sibling);
		}
		sibling = sibling.nextSibling;
	}

	return t_object;
}

function getRandomChar()
{
	var chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
	return chars.substr( Math.floor(Math.random() * 62), 1 );
}
function uniqueID(size)
{
	var str = "";

	if (!size) size = 15;

	for(var i = 0; i < size; i++) {
		str += getRandomChar();
	}
	
	return str;
}

function set_slideshow(e, p_object, p_id)
{
	cancelevent(e);
	$("#" + p_object).slideShow( { find: p_id } );
}

function isdeprecated(p_version) {
	var result = navigator.userAgent.toLowerCase().indexOf('msie 6');
	
	if (result == -1 && (!p_version || p_version == 7)) {
		result = navigator.userAgent.toLowerCase().indexOf('msie 7');
	}
	if (result == -1 && (!p_version || p_version == 8)) {
		result = navigator.userAgent.toLowerCase().indexOf('msie 8');
	}
	
	return result;
}

function switch_tabs(e, p_item)
{
	cancelevent(e);

	$("#tabs-controler-parent").find(".tab").removeClass("selected");
	$($("#tabs-controler-parent").find(".tab").prototype[p_item]).addClass("selected");
}

$("document").onload( function() {
	var head  = document.getElementsByTagName('head')[0];
    var link  = document.createElement('link');
    link.rel  = 'stylesheet';
    link.type = 'text/css';
    link.href = '../css/action.css';
    link.media = 'all';
    head.appendChild(link);
});
