//-------------------------------------------------------------------------------------------------
//
//   mmlib.js
//
//   Autor Miroslav Marinković
//   Copyright (C) Fifoconsult, 2008.
//   programming@fifoconsult.co.yu
//   www.fifoconsult.co.yu
//
//   Some parts of the code are based on Douglas Crockford's JS courses.
//   http://javascript.crockford.com
//
////

// Namespaces
mmlib = {};
mmlib.Util = {};
mmlib.DOM = {};
mmlib.Trans = {};
mmlib.Snipets = {};

//
//  Utility
////////////////////////////////////////////////////////////////////////////////////////////////////
mmlib.Util.typeOf = function(obj){
	if (typeof obj == 'object'){
		if (obj instanceof Array){
			return 'array';
		}
		else if (obj === null){
			return 'null';
		}
		else{
			return 'object';
		}
	}
	else if (typeof obj == 'number'){
		return 'number';
	}
	else if (typeof obj == 'string'){
		return 'string';
	}
	else if (typeof obj == 'function'){
		return 'function';
	}
	else if (typeof obj == 'boolean'){
		return 'boolean';
	}
	return 'undefined';
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.isSet = function(a){
	return (typeof a != "undefined");
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.isIE = function(){
	return (window.ActiveXObject != undefined);
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.isLowIE = function(){
	return (mmlib.Util.isIE() && document.body.maxHeight == undefined);
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.isOpera = function(){
	return (typeof window.opera != "undefined");
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.delayExecution = function(delay, params, callback){
	var thread = false;
	
	function execute(){
		callback(params);
		if (thread !== false){
			clearTimeout(thread);
		}
	}
	
	if (delay > 0){
		thread = setTimeout(execute, delay);
	}
	else{
		callback(params);	
	}
}

//--------------------------------------------------------------------------------------------------
mmlib.Util.findElement = function(element){
	if (!element){
		return null;
	}
	
	switch (mmlib.Util.typeOf(element)){
		case 'string':
			element = mmlib.DOM.getElement(element);
			break;
		case 'object':
			element = (element.c_FCT ? element : mmlib.DOM.node(element));
			break;
		default:
			return null;
	}
	
	if (!element.element){
		return null;
	}
	
	return element;
}

//
//  DOM
////////////////////////////////////////////////////////////////////////////////////////////////////
mmlib.DOM.node = function(){
	return {
		c_FCT: true,
		Opacity: 100,
		DispH: function(a){
			if (a){
				return a.offsetHeight;
			}
			return 0;
		}(arguments[0]),
		
		element: arguments[0] || null,
		
		create: function(tagName){
			var props = arguments[1] || {};
			this.element = document.createElement(tagName);
			for(var i in props){
				this.element[i] = props[i];
			}      
			return this;
		},
		
		// Props
		setStyle: function(attribute, value){
			if (this.element.style[attribute] != undefined){
				this.element.style[attribute] = value;
				if (this.element.parentNode){
					if (!attribute.equal('display') && !attribute.equal('height')){
						this.DispH = this.element.offsetHeight;
					}
				}
			}
			return this;    
		},
		
		setAttribute: function(attribute, value){
			return this.setStyle(attribute, value);
		},
		
		getStyle: function(attribute){
			return this.element.style[attribute];
		},
		
		getCurrentStyle: function(attribute){
			return (
				this.element.currentStyle ? 
				this.element.currentStyle[attribute] : 
				document.defaultView.getComputedStyle(this.element, "").getPropertyValue(attribute)
			);
		},
		
		applyCSS: function(props){
			for(var i in props){
				if (this.element.style[i] != undefined){
					this.element.style[i] = props[i];
				}
			}
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		setOpacity: function(amount){
			this.Opacity = amount;
			if (mmlib.Util.isSet(arguments[1]) && mmlib.Util.isIE()){
				return this;
			}
			if (this.element.style.opacity != undefined){
				this.element.style.opacity = amount/100;
			}
			else if (this.element.style.filter != undefined){
				this.element.style.filter = "alpha(opacity="+amount+")";
			}
			else if (this.element.style.MozOpacity != undefined){
				this.element.style.MozOpacity = amount/100;
			}
			return this;
		},
		
		getPosition: function(){
			var _left = 0;
			var _top = 0;
			var obj = this.element;
			if (!this.element){
				return {x:0,y:0};
			}
			while (obj.offsetParent){
				_left += obj.offsetLeft;
				_top += obj.offsetTop;
				obj = obj.offsetParent;
			}
			_left += obj.offsetLeft;
			_top += obj.offsetTop;
			return {x:_left, y:_top};
		},
		
		move: function(pos){
			if (pos.x != undefined){
				this.element.style.left = pos.x + (
					mmlib.Util.typeOf(pos.x).equal('number') ? 'px' : (
						pos.x.indexOf('px') != -1 ? '' : 'px'
					)
				); 
			}
			if (pos.y != undefined){
				this.element.style.top = pos.y + (
					mmlib.Util.typeOf(pos.y).equal('number') ? 'px' : (
						pos.y.indexOf('px') != -1 ? '' : 'px'
					)
				);
			}
			return this;
		},
		
		resize: function(size){
			if (size.x != undefined){
				this.element.style.width = size.x + (
					mmlib.Util.typeOf(size.x).equal('number') ? 'px' : (
						size.x.indexOf('px') != -1 ? '' : 'px'
					)
				); 
			}
			if (size.y != undefined){
				this.element.style.height = size.y + (
					mmlib.Util.typeOf(size.y).equal('number') ? 'px' : (
						size.y.indexOf('px') != -1 ? '' : 'px'
					)
				);
			}
			return this;
		},
		
		applyPngHack: function(){
			if (mmlib.Util.isLowIE()){
				if (this.element.firstChild && this.element.firstChild.tagName){
					if (this.element.firstChild.tagName.equal("img")){
						if (this.element.firstChild.src.indexOf('.png') != -1){
							this.element.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod='image', src='"+this.element.firstChild.src+"');";
							this.element.innerHTML = '';
						}
					}
				}
				var img = this.getCurrentStyle('backgroundImage');
				if (!img){
					img = this.getStyle('backgroundImage');
				}
				if (img){					
					var p1 = img.replace(/url\((.+)\)/, "$1");
					p1 = p1.replace(/"/g, "");
					if (p1.indexOf('.png') != -1){
						this.element.style.backgroundImage = '';
						this.element.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src='"+p1+"');";
					}
				}
				if (this.element.parentNode){
					this.DispH = this.element.offsetHeight;
				}
			}
			return this;
		},
		
		// content
		setInnerHTML: function(content){
			this.element.innerHTML = content;
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		appendInnerHTML: function(content){
			this.element.innerHTML += content;
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		prependInnerHTML: function(content){
			this.element.innerHTML = content + this.element.innerHTML;
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		// node relations
		appendChild: function(child){
			child = (child.c_FCT ? child.element : child);
			this.element.appendChild(child);
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		insertChild: function(child){
			child = (child.c_FCT ? child.element : child);
			var sibling = (arguments[1] || this.element.firstChild);
			this.element.insertBefore(child, sibling);
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		removeChild: function(child){
			child = (child.c_FCT ? child.element : child);
			this.element.removeChild(child);
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this; 
		},
		
		appendSelf: function(){
			var parent = (arguments[0] || document.body);
			parent = (parent.c_FCT ? parent.element : parent);
			parent.appendChild(this.element);
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		insertSelf: function(){
			var parent = (arguments[0] || document.body);
			parent = parent.c_FCT ? parent.element : parent;
			var sibling = (arguments[1] || parent.firstChild);
			sibling = sibling ? (sibling.c_FCT ? sibling.element : sibling) : null;
			parent.insertBefore(this.element, sibling);
			if (this.element.parentNode){
				this.DispH = this.element.offsetHeight;
			}
			return this;
		},
		
		removeSelf: function(){
			if (this.element.parentNode){
				this.element.parentNode.removeChild(this.element);
			}
			return this;
		},
		
		firstChild: function(){
			return this.element.firstChild;
		},
		
		// events
		addEvent: function(type, callback){
			if (this.element.addEventListener){
				this.element.addEventListener(type, callback, false);
			}
			else if (this.element.attachEvent){
				this.element.attachEvent("on"+type, callback);
			}
			else if (this.element["on"+type]){
				this.element["on"+type] = callback;
			}
			return this;
		},
		
		removeEvent: function(type){
			if (this.element["on"+type]){
				this.element["on"+type] = null;
			}
			return this;
		},
		
		// misc
		offsetHeight: function(){
			return this.element ? parseInt(this.element.offsetHeight) : 0;
		},
		
		offsetWidth: function(){
			return this.element ? parseInt(this.element.offsetWidth) : 0;
		},
		
		offsetLeft: function(){
			return parseInt(this.element.offsetLeft);
		},
		
		offsetTop: function(){
			return parseInt(this.element.offsetTop);
		},
		
		toggleSelf: function(){
			var display = this.getCurrentStyle('display');
			if (!display.equal('none')){
				this.setStyle('display', 'none');
			}
			else{
				this.setStyle('display', 'block');
			}
			return this;
		},
		
		visible: function(){
			return (!this.getCurrentStyle('display').equal('none'));
		},
		
		value: function(){
			if (this.element.tagName){
				if (this.element.tagName.equal('select')){
					return this.element.options[this.element.selectedIndex].value; 
				}
				else if (this.element.tagName.equal('input') || this.element.tagName.equal('textarea')){
					return this.element.value;
				}
				else if (this.element.innerHTML){
					return this.element.innerHTML;
				}
			}
			return undefined;
		}
	};
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.Event = function(ev){
	var _ev = ev || window.event;
	var _type = _ev.type;
	var _key = (_type.indexOf('key') != -1 ? (_ev.which || _ev.code) : undefined);
	var _pos = {x: undefined, y: undefined};
	
	var _src = _ev.target || _ev.srcElement;
	if (_src && _src.nodeType == 3){
		_src = _src.parentNode;
	}
	
	var _related = _ev.relatedTarget || _src;
	if (_related && _related.nodeType == 3){
		_related = _related.parentNode;
	}
	
	_src = mmlib.DOM.node(_src);
	_related = mmlib.DOM.node(_related);
	
	if (_ev.pageX || _ev.pageY){
		_pos.x = ev.pageX;
		_pos.y = ev.pageY;
	}
	else{
		_pos.x = _ev.clientX + document.body.scrollLeft - document.body.clientLeft;
		_pos.y = _ev.clientY + document.body.scrollTop  - document.body.clientTop;
	}
	
	var _client = {
		x:_ev.clientX, 
		y:_ev.clientY
	};

	return {
		ref: _ev,
		src: _src,
		mouse: _pos,
		client: _client,
		type: _type,
		key: _key,
		related: _related,
		
		stop: function(){
			this.ref.cancelBubble = true;
			if (this.ref.stopPropagation){
				this.ref.stopPropagation();
			}
			this.ref.returnValue = false;
			if (this.ref.preventDefault){
				this.ref.preventDefault();
			}
			return this;
		}
	};
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.walkTheDOM = function(node, callback){
	if (!node) return;
	callback(node);
	node = node.firstChild;
	while (node){
		mmlib.DOM.walkTheDOM(node, callback);
		node = node.nextSibling;
	}
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.getElementsByTagName = function(tagName){
	var nodes = [];
	var startNode = arguments[1] || mmlib.DOM.node(document.body);
	
	function compare(node){
		if (node.tagName != undefined){
			var names = [];
			switch(mmlib.Util.typeOf(tagName)){
				case 'string':
					names = tagName.split(" ");
					break;
				case 'array':
					names = tagName;
					break;
				default:
					break;  
			}
			for (var i=0; i<names.length; i++){
				if (node.tagName.equal(names[i])){
					nodes.push(mmlib.DOM.node(node));
					break;
				}
			}
		}
	}
	
	mmlib.DOM.walkTheDOM(startNode.element, compare);
	
	return nodes;
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.walkElements = function(condition, callback){
	// condition :
	// TAG_NAME . CLASS_NAME  ( 1 class at a time )
	// TAG_NAME # ELEMENT_NAME  ( ie. name[] )
	var tagName = '';
	var propName = '';
	var mode = 'name';
	if (condition.indexOf('#') != -1){
		tagName = condition.split('#')[0];
		propName = condition.split('#')[1];
	}
	else if (condition.indexOf('.') != -1){
		tagName = condition.split('.')[0];
		propName = condition.split('.')[1];
		mode = 'class';
	}
	else{
		return false;
	}
	
	if (tagName.empty() || propName.empty()){
		return false;
	}
	
	function removeSquareBrackets(str){
		if (str.indexOf('[]') != -1){
			str = str.substr(str.indexOf('[]'), 2);
		}
		return str;
	}
	
	propName = removeSquareBrackets(propName);
	
	mmlib.DOM.getElementsByTagName(tagName).walk(function(el){
		if (el.c_FCT){
			switch (mode){
				case 'name':
					if (el.element.name){
						var n = removeSquareBrackets(el.element.name);
						if (n.equal(propName)){
							callback(el);
						}
					}
					break;
				case 'class':
					if (el.element.className){
						var names = el.element.className.split(" ");
						for(var i=0; i<names.length; i++){
							if (names[i].equal(propName)){
								callback(el);
								break;
							}
						}
					}
					break;
				default:
					break;
			}
		}
	});
	
	return true;
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.walkChildren = function(element, types, callback){
	element = mmlib.Util.findElement(element);

	var child = (element.c_FCT ? element.element.firstChild : element.firstChild);
	if (!child){
		return false;
	}
	
	while(child){
		if (child.tagName != undefined){
			var names = [];
			switch (mmlib.Util.typeOf(types)){
				case 'string':
					names = types.split(" ");
					break;
				case 'array':
					names = types;
					break;
				default:
					break;
			}
			for(var i=0; i<names.length; i++){
				if (child.tagName.equal(names[i])){
					callback(mmlib.DOM.node(child));
				}
			}
		}
		child = child.nextSibling;
	}
	
	return true;  
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.getElement = function(id){
	return mmlib.DOM.node(
		document.getElementById(id) || undefined
	);
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.nodeExists = function(id){
	var e = document.getElementById(id);
	return (e ? true : false);
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.getTextSize = function(text){
	var el = mmlib.DOM.node().create('div');
	var ret = {};
	var styles = arguments[1] || {};
	
	styles.position = 'absolute';
	styles.display = 'block';
	el.applyCSS(styles);
	el.setInnerHTML(text);
	el.insertSelf(document.body);
	ret.width = el.offsetWidth();
	ret.height = el.offsetHeight();
	el.removeSelf();
	
	return ret;
}

//--------------------------------------------------------------------------------------------------
mmlib.DOM.WindowDispatcher = function(){
	var OnLoad = [];
	var OnScroll = [];
	var OnResize = [];
	var OnUnload = [];
	var Window = mmlib.DOM.node(window);
	
	function purgeEvents(){
		var events = [OnLoad, OnScroll, OnResize, OnUnload];
		for(var i=0; i<events.length; i++){
			for(var j=0; j<events[i].length; j++){
				if (mmlib.Util.typeOf(events[i][j].callback).equal('function')){
					events[i][j].callback = null;
				}
			}
		}
	}
	
	function WindowLoad(ev){
		ev = mmlib.DOM.Event(ev);
		for(var i=0; i<OnLoad.length; i++){
			if (mmlib.Util.typeOf(OnLoad[i].callback).equal('function')){
				OnLoad[i].callback(ev);
			}
		}
	}
	
	function WindowScroll(ev){
		ev = mmlib.DOM.Event(ev);
		for(var i=0; i<OnScroll.length; i++){
			if (mmlib.Util.typeOf(OnScroll[i].callback).equal('function')){
				OnScroll[i].callback(ev);
			}
		}
	}
	
	function WindowResize(ev){
		ev = mmlib.DOM.Event(ev);
		for(var i=0; i<OnResize.length; i++){
			if (mmlib.Util.typeOf(OnResize[i].callback).equal('function')){
				OnResize[i].callback(ev);
			}
		}
	}
	
	function WindowUnload(ev){
		ev = mmlib.DOM.Event(ev);
		for(var i=0; i<OnUnload.length; i++){
			if (mmlib.Util.typeOf(OnUnload[i].callback).equal('function')){
				OnUnload[i].callback(ev);
			}
		}    
		purgeEvents();
	}
	
	Window
	.addEvent('load', WindowLoad)
	.addEvent('unload', WindowUnload)
	.addEvent('scroll', WindowScroll)
	.addEvent('resize', WindowResize);
	
	return {
		hwnd: Window,
		
		add: function(ev, callback){
			ev = ev.toLowerCase();
			var identifier = String(arguments[2] || "");
			switch(ev){
				case 'load':
					OnLoad.push({callback: callback, id: identifier});
					break;
				case 'scroll':
					OnScroll.push({callback: callback, id: identifier});
					break;
				case 'resize':
					OnResize.push({callback: callback, id: identifier});
					break;
				case 'unload':
					OnUnload.push({callback: callback, id: identifier});
					break;
			}
		},
		
		remove: function(ev, identifier){
			var i;
			ev = ev.toLowerCase();
			switch (ev){
				case 'load':
					for(i=0; i<OnLoad.length; i++){
						if (OnLoad[i].id.equal(identifier)){
							OnLoad.splice(i, 1);
							break;  
						}
					}
					break;
				case 'scroll':
					for(i=0; i<OnLoad.length; i++){
						if (OnScroll[i].id.equal(identifier)){
							OnScroll.splice(i, 1);
							break;  
						}
					}
					break;
				case 'resize':
					for(i=0; i<OnLoad.length; i++){
						if (OnResize[i].id.equal(identifier)){
							OnResize.splice(i, 1);
							break;  
						}
					}
					break;
				case 'unload':
					for(i=0; i<OnUnload.length; i++){
						if (OnUnload[i].id.equal(identifier)){
							OnUnload.splice(i, 1);
							break;  
						}
					}
					break;
			}
		}
	};
}();

//
//  ImageLoader
////////////////////////////////////////////////////////////////////////////////////////////////////
mmlib.ImageLoader = function(){
	if (!document.images){
		throw{
			name: 'Error',
			message: 'Image object not supported.',
			source: 'mmlib.ImageLoader',
			id: '1'
		}
	}

	var images = arguments[0];
	if (images.length == 0){
		throw{
			name: 'Error',
			message: 'No images to load.',
			source: 'mmlib.ImageLoader',
			id: '2'
		};
	}
	return {
		Images: [],
		Src: images,
		Next: 0,
		Last: images.length,
		Errors: [],
		onload: function(){},
		onerror: function(){},
		
		AddHandler: function(type, handler){
			this["on"+type] = handler;
			return this;
		},
		
		Load: function(){
			this.LoadImage(this);
			return this;
		},
		
		LoadImage: function(obj){
			if (obj.Next == obj.Last){
				obj.onload(obj);
				return;
			}
			
			obj.Images[obj.Next] = new Image();
			obj.Images[obj.Next].onload = obj.Images[obj.Next].onerror = obj.Images[obj.Next].onabort = function(){
				this.onload = this.onerror = this.onabort = null;
				if (!this.complete){
					obj.Errors.push({
						src: this.src
					});
					obj.onerror(obj, this.src);
				}
				obj.Next++;
				obj.LoadImage(obj);
			}
			obj.Images[obj.Next].src = obj.Src[obj.Next];
		}
	};
}

//
//  Trans
////////////////////////////////////////////////////////////////////////////////////////////////////
mmlib.Trans.Fade = function(obj, options){
	obj = mmlib.Util.findElement(obj);
	if (!obj){
		return;
	}
	if (options.direction == undefined){
		throw{
			name: 'Error',
			message: 'No direction ("fadein", "fadeout") given.',
			source: 'mmlib.Trans.Fade',
			id: '1'
		};
	} 
	
	var direction = options.direction;
	var duration = options.duration || 500;
	var fps = options.fps || 50;
	var delay = options.delay || 0;
	var startOpacity = options.startOpacity || (direction.equal('fadein') ? 0 : 100);
	var endOpacity = options.endOpacity || (direction.equal('fadein') ? 100 : 0);
	var onfinish = options.onfinish || function(){};
	var onbeforestart = options.onbeforestart || function(){};
	var onbeforechange = options.onchange || function(){};
	var onafterchange = options.onafterchange || function(){};
	
	var dx = endOpacity - startOpacity;
	if (dx == 0){
		onfinish(obj);
		return;
	}
	
	var thread = false;
	var current = startOpacity;
	var starttime;

	if (fps == 50){
		duration = (Math.abs(dx) >= 250 ? Math.abs(dx) : 250);
	}
	
	var interval = Math.ceil(duration / fps);  
	var vel = dx / duration;
	
	function recalculate(){
		var now = new Date().getTime();
		if (now < starttime + duration){
			current = startOpacity + (now - starttime) * vel;
		}
		else{
			current = endOpacity;
		}
	}
	
	function fade(){
		onbeforechange(obj);
		obj.setOpacity(current);
		onafterchange(obj);
		if (current == endOpacity){
			clearInterval(thread);
			onfinish(obj);
			return;
		}
		recalculate();
	}
	
	function applyDelay(){
		starttime = new Date().getTime();
		thread = setInterval(fade, interval);
	}
	
	onbeforestart(obj);
	
	if (delay > 0){
		setTimeout(applyDelay, delay);
	}
	else{
		starttime = new Date().getTime();
		thread = setInterval(fade, interval);
	}
}

//--------------------------------------------------------------------------------------------------
mmlib.Trans.Change = function(element, options){
	element = mmlib.Util.findElement(element);
	if (element === null){
		return;  
	}

	var obj = element;
	var attribute = options.attribute;
	var fromval = options.startval;
	var toval = options.endval;
	var fps = options.fps || 50;
	var duration = options.duration || 500;
	var onbeforestart = options.onbeforestart || function(){};
	var onbeforechange = options.onbeforechange || function(){};
	var onafterchange = options.onafterchange || function(){};
	var onfinish = options.onfinish || function(){};
	var delay = options.delay || 0;
	
	var suffix = '';
	var dx = toval - fromval;
	if (dx == 0){
		onfinish(obj);
		return;
	}
	
	switch (attribute){
		case 'width':
		case 'height':
		case 'left':
		case 'top':
			suffix = 'px';
			break;
		default:
			onfinish(obj);
			return;
	}
	
	if (fps == 50){
		duration = (Math.abs(dx) >= 250 ? Math.abs(dx) : 250);
	}
	
	var thread = false;
	var current = fromval;
	var starttime;
	var interval = Math.ceil(duration / fps);	
	var vel = dx / duration;
		
	function recalculate(){
		var now = new Date().getTime();
		if (now < starttime + duration){
			current = fromval + (now - starttime) * vel;
		}
		else{
			current = toval;
		}
//		dbg.appendInnerHTML(current+'<br />');
	}
	
	function change(){
		if (onbeforechange(obj)){
			return;
		}
		if (obj.element.tagName.equal('img') && (attribute.equal('width') || attribute.equal('height'))){
			obj.element[attribute] = current;
		}
		else{
			obj.setStyle(attribute, current+suffix);
		}
		if (onafterchange(obj)){
			current = toval;
		}
		if (current == toval){
			clearInterval(thread);
			onfinish(obj);
			return;
		}
		recalculate();
	}
	
	function applyDelay(){
		starttime = new Date().getTime();
		thread = setInterval(change, interval);
	}
	
	onbeforestart(obj);
	
	if (delay > 0){
		setTimeout(applyDelay, delay);
	}
	else{
		starttime = new Date().getTime();
		thread = setInterval(change, interval);
	}
}

//--------------------------------------------------------------------------------------------------
mmlib.Trans.CenteredResize = function(element, options){
	element = mmlib.Util.findElement(element);
	if (element === null){
		return;
	}

	var obj = element;
	var fromwidth = options.startwidth;
	var towidth = options.endwidth;
	var fromheight = options.startheight;
	var toheight = options.endheight;
	var fps = options.fps || 50;
	var duration = options.duration || 500;
	var onbeforestart = options.onbeforestart || function(){};
	var onbeforechange = options.onbeforechange || function(){};
	var onafterchange = options.onafterchange || function(){};
	var onfinish = options.onfinish || function(){};
	var delay = options.delay || 0;
	var startpos = {
		x: obj.offsetLeft(),
		y: obj.offsetTop()
	};
	var prop = {
		size: {
			x: fromwidth, y: fromheight
		},
		position: {
			x: startpos.x, y: startpos.y
		}
	};
	
	var dW = towidth - fromwidth;
	var dH = toheight - fromheight;
	var dMax = Math.max(dW, dH);
	if (dMax == 0){
		onfinish(obj);
		return;
	}
	
	if (fps == 50){
		duration = (Math.abs(dMax) >= 250 ? Math.abs(dMax) : 250);
	}
	
	var thread = false;
	var currentsize = {
		x: fromwidth,
		y: fromheight
	};
	var currentpos = {
		x: startpos.x,
		y: startpos.y
	};
	var starttime;
	var interval = Math.ceil(duration / fps);  
	var velX = dW / duration;
	var velY = dH / duration;
	
	function recalculate(){
		var now = new Date().getTime();
		if (now < starttime + duration){
			currentsize.x = Math.ceil(fromwidth + (now - starttime) * velX);
			currentsize.y = Math.ceil(fromheight + (now - starttime) * velY);
		}
		else{
			currentsize.x = towidth;
			currentsize.y = toheight;
		}
		currentpos.x = Math.ceil((fromwidth - currentsize.x) / 2 + startpos.x);
		currentpos.y = Math.ceil((fromheight - currentsize.y) / 2 + startpos.y);
		prop.size.x = currentsize.x;
		prop.size.y = currentsize.y;
		prop.position.x = currentpos.x
		prop.position.y = currentpos.y;
	}
	
	function resize(){
		onbeforechange(obj, prop);
		if (obj.element.tagName.equal('img')){
			obj.element.width = currentsize.x;
			obj.element.height = currentsize.y;
		}
		else{
			obj.resize(currentsize);
		}
		obj.move(currentpos);
		onafterchange(obj, prop);
		if (currentsize.x == towidth && currentsize.y == toheight){
			clearInterval(thread);
			onfinish(obj);
			return;
		}
		recalculate();
	}
	
	function applyDelay(){
		starttime = new Date().getTime();
		thread = setInterval(resize, interval);
	}
	
	onbeforestart(obj);
	
	if (delay > 0){
		setTimeout(applyDelay, delay);
	}
	else{
		starttime = new Date().getTime();
		thread = setInterval(resize, interval);
	}
}

//
//  Snipets
////////////////////////////////////////////////////////////////////////////////////////////////////
mmlib.Snipets.Overlay = function(){
	var obj = mmlib.Util.findElement(arguments[0]);
	if (!obj){
		obj = mmlib.DOM.node().create('div');
	}
	obj.removeSelf();
	obj.insertSelf();
	obj.applyCSS({
		position:'absolute',
		width:document.documentElement.clientWidth+'px',
		height:document.documentElement.clientHeight+'px',
		left:'0px',
		top:document.documentElement.scrollTop+'px',
		display:'block',
		zIndex:'65500'
	});
	
	if (!mmlib.Util.isLowIE()){
		obj.applyCSS({
			position: 'fixed', top: '0px'
		});
	}
	
	var scrollId = 'Overlay_OnScroll'+new Date().getTime(), resizeId = 'Overlay_Onresize_'+new Date().getTime();
	
	return {
		self: obj,
	
		show: function(){
			obj.applyCSS({display:'block'});
			if (mmlib.Util.isLowIE()){
				mmlib.DOM.WindowDispatcher.add('scroll', function(){
					obj.setAttribute('top', document.documentElement.scrollTop+'px');
				}, scrollId);
			}
			mmlib.DOM.WindowDispatcher.add('resize',
				function(){
					obj.applyCSS({
						left:'0px',
						top:(mmlib.Util.isLowIE() ? document.documentElement.scrollTop : 0)+'px',
						width:document.documentElement.clientWidth+'px',
						height:document.documentElement.clientHeight+'px'
					});
				},
				resizeId
			);
			return this;
		},
		
		hide: function(){
			obj.applyCSS({display:'none'});
			if (mmlib.Util.isLowIE()){
				mmlib.DOM.WindowDispatcher.remove('scroll', scrollId);
				mmlib.DOM.WindowDispatcher.remove('resize', resizeId);
			}
			return this;
		}
	};
}

//--------------------------------------------------------------------------------------------------
//
mmlib.Snipets.SSBox = function(){
	var options = arguments[0] || {};
	var box = mmlib.DOM.node().create('div');
	var size = options.size || {x: 300, y: 300};
	var loadingsize = {x: 100, y: 100};
	var onshow = options.onshow || function(){};
	var onclose = options.onclose || function(){return true;};
	var ajaxdata = options.ajaxdata || {options:null, identify:false};
	
	var content;
	var handle = options.handle || 'text';
	handle = handle.toLowerCase();
	
	switch (handle){
		case 'text':  // id
			content = mmlib.Util.findElement(options.rel);
			if (!content){
				throw{
					name: 'Error',
					message: 'Given element does not exist.',
					id: '1',
					source: 'mmlib.Snipets.SSBox'
				}
				return;
			}
			//content.removeSelf();
			content.setStyle('display', 'none');
			break;
		case 'image':
		case 'ajax':
		case 'iframe':  // src
			content = options.rel;
			break;
		default:
			content = null;
			break;
	}
	
	if (content === null){
		return;
	}
	
	box.applyCSS({
		position:'absolute',
		left:(document.documentElement.clientWidth - (size.x+45))/2 + 'px',
		top:(document.documentElement.clientHeight - (size.y+45))/2 + 'px',
		width: size.x+'px', height: size.y+'px', 
		display:'block', zIndex:'65510', 
		padding: '20px', overflow:'hidden', background:'#D9D7D7'
	});
	
	if (box.element.style.borderRadius){
		box.element.style.borderRadius = '1em';
	}
	else if (box.element.style.MozBorderRadius){
		box.element.style.MozBorderRadius = '1em';
	}
	
	if (!mmlib.Util.isLowIE()){
		box.setStyle('position', 'fixed');
	}
	
	var overlay = mmlib.Snipets.Overlay(
		mmlib.DOM.node().create('div').setAttribute('background', '#231F20').setOpacity(0)
	);
	
	var closebutton = mmlib.DOM.node().create('div')
	.applyCSS({
		position:'absolute', right:'3px', top:'3px', width:'12px', height:'12px', cursor:'pointer', display:'block',
		lineHeight:'13px', textAlign:'center', color:'black', border:'#D9D7D7 1px solid', 
		fontWeight:'bold', fontSize:'10px'
	})
	.setInnerHTML('X')
	.addEvent('mouseover', function(ev){
		ev = mmlib.DOM.Event(ev).stop();
		ev.src.setStyle('color', 'white');
	})
	.addEvent('mouseout', function(ev){
		ev = mmlib.DOM.Event(ev).stop();
		ev.src.setStyle('color', 'black');
	})
	.addEvent('click', function(ev){
		mmlib.DOM.Event(ev).stop();
		removeBox();
	});
	
	var loader = mmlib.DOM.node().create('div').applyCSS({
		position:'relative', cssFloat:'left', width:'100%', height:'100%'
	});

	box.appendChild(closebutton);
	box.appendChild(loader);
	
	function doresize(data){
		var hh = screen.availHeight - 200;
		if (data.endheight > hh){
			data.endwidth = (data.endwidth * hh) / data.endheight;
			data.endwidth = Math.ceil(data.endwidth);
			data.endheight = hh;
			
			if (handle.equal('image')){
				loader.setInnerHTML(
					'<img src="'+content+'" width="'+data.endwidth+'" height="'+data.endheight+'" alt="" />'
				);
			}
		}
		
		mmlib.Trans.CenteredResize(box, {
			startwidth: data.startwidth, endwidth: data.endwidth,
			startheight: data.startheight, endheight: data.endheight,
			onfinish: data.onfinish
		});
	}
	
	function loadimage(){
		mmlib.ImageLoader([content]).AddHandler("load", function(){
			var fromwidth = loadingsize.x, towidth = this.Images[0].width;
			var fromheight = loadingsize.y, toheight = this.Images[0].height;
			
			loader.applyCSS({
				overflow:'hidden',
				padding:'0px',
				width: towidth+'px',
				height: toheight+'px'
			})
			.setInnerHTML(
				'<img src="'+content+'" width="'+this.Images[0].width+'" height="'+this.Images[0].height+'" alt="" />'
			)
			.setOpacity(0);
			
			doresize({
				startwidth: fromwidth, endwidth: towidth,
				startheight: fromheight, endheight: toheight,
				onfinish: function(){
					mmlib.Trans.Fade(loader, {
						direction:'fadein', onfinish: function(){
							onshow(box);
						}
					});
				}
			});
		})
		.Load();
	}
	
	function loadajax(){
		mmlib.Ajax('ajax.php', {
			options:ajaxdata.options,
			identify:ajaxdata.identify,
			onsuccess:function(xhr){
				if (options.onshow){
					onshow({
						ssbox: box, 
						ajax: xhr, 
						loadsize: loadingsize,
						ssboxcontent: loader
					});
				}
				else{
					var fromwidth = loadingsize.x, towidth = size.x;
					var fromheight = loadingsize.y, toheight = size.y;
					
					loader.setInnerHTML('');
				
					doresize({
						startwidth: fromwidth, endwidth: towidth,
						startheight: fromheight, endheight: toheight,
						onfinish: function(){
							loader.applyCSS({
								overflow:'auto',
								padding:'0px',
								width: towidth+'px',
								height: toheight+'px'
							});
							loader.setInnerHTML(
								decodeURIComponent(xhr.responseText)
							);
						}
					});
				}
			}
		});
	}
	
	var scrollId = 'SSBox_OnScroll'+new Date().getTime(), resizeId = 'SSBox_OnResize'+new Date().getTime();
	
	function displayBox(){
		if (mmlib.Util.isLowIE()){
			mmlib.DOM.getElementsByTagName('select').walk(function(el){
				el.setStyle('display', 'none');
			});
		}
	
		mmlib.Trans.Fade(overlay.show().self, {
			direction:'fadein', 
			endOpacity:75, 
			duration:500,
			onfinish: function(){
				switch (handle){
					case 'text':
						box.insertSelf();
						loader.setStyle('overflow', 'auto');
						loader.appendChild(content.setStyle('display', 'block'));
						if (mmlib.Util.isLowIE()){
							mmlib.DOM.WindowDispatcher.add('scroll', 
								function(){
									box.setAttribute('top', ((document.documentElement.scrollTop + (document.documentElement.clientHeight - box.offsetHeight())/2)+'px'));
								},
								scrollId
							);
						}
						onshow(box);
						break;
						
					case 'image':
						var _w = loadingsize.x, _h = loadingsize.y,
						_x = ( document.documentElement.clientWidth - ( loadingsize.x+45 ) ) / 2,
						_y = ( document.documentElement.clientHeight - ( loadingsize.y+45 ) ) / 2;
						if (mmlib.Util.isLowIE()){
							_y += document.documentElement.scrollTop;
						}
						loader.applyCSS({
							width:'auto', height:'auto', paddingTop:'34px', paddingLeft:'34px'
						}).setInnerHTML('<img src="images/loadingbig.gif" width="32" height="32" alt="..." />');
						box.insertSelf()
						.applyCSS({width:_w+'px', height:_h+'px', left:_x+'px', top:_y+'px'});
						if (mmlib.Util.isLowIE()){
							mmlib.DOM.WindowDispatcher.add('scroll', function(){
								box.setAttribute('top', ((document.documentElement.scrollTop + (document.documentElement.clientHeight - box.offsetHeight())/2)+'px'));
							}, scrollId);
						}
						setTimeout(loadimage, 100);
						break;
						
					case 'iframe':
						loader.setInnerHTML(
							'<iframe src="'+content+'" style="width:'+size.x+'px;height:'+size.y+'px;border:0px"></iframe>'
						);
						box.insertSelf();
						if (mmlib.Util.isLowIE()){
							mmlib.DOM.WindowDispatcher.add('scroll', 
								function(){
									box.setAttribute('top', ((document.documentElement.scrollTop + (document.documentElement.clientHeight - box.offsetHeight())/2)+'px'));
								},
								scrollId
							);
						}
						onshow(box);
						break;
						
					case 'ajax':
						box.applyCSS({
							width:loadingsize.x+'px',
							height:loadingsize.y+'px',
							left:(document.documentElement.clientWidth - (loadingsize.x+45))/2 + 'px',
							top:(document.documentElement.clientHeight - (loadingsize.y+45))/2 + 'px'
						})
						loader.applyCSS({
							width:'auto', height:'auto', paddingTop:'34px', paddingLeft:'34px'
						}).setInnerHTML('<img src="images/loadingbig.gif" width="32" height="32" alt="..." />');
						box.insertSelf();
						if (mmlib.Util.isLowIE()){
							mmlib.DOM.WindowDispatcher.add('scroll', function(){
								box.setAttribute('top', ((document.documentElement.scrollTop + (document.documentElement.clientHeight - box.offsetHeight())/2)+'px'));
							}, scrollId);
						}
						setTimeout(loadajax, 5);
						break;
					
				}
				mmlib.DOM.WindowDispatcher.add('resize',
					function(){
						box.applyCSS({
							left:(document.documentElement.clientWidth - box.offsetWidth())/2 + 'px',
							top:(document.documentElement.clientHeight - box.offsetHeight())/2 + 'px'
						});
					},
					resizeId
				);
			}
		});			
	}
	
	function removeBox(){
		if (!onclose()){
			return;
		}
	
		if (mmlib.Util.isLowIE()){
			mmlib.DOM.getElementsByTagName('select').walk(function(el){
				el.setStyle('display', 'block');
			});
		}		
	
		mmlib.Trans.Fade(overlay.self, {
			direction:'fadeout',
			startOpacity:75,
			duration:500,
			onbeforestart: function(){
				if (handle.equal('text')){
					content.setStyle('display', 'none').removeSelf().insertSelf();
				}
				box.removeSelf();
			},
			onfinish: function(){
				if (mmlib.Util.isLowIE()){
					mmlib.DOM.WindowDispatcher.remove('scroll', scrollId);
				}
				mmlib.DOM.WindowDispatcher.remove('resize', resizeId);
				overlay.self.removeSelf();
			}
		});
	}
	
	return {
		self: box,
		hide: function(){
			removeBox();
		},
		display: function(){
			displayBox();			
			document.onkeydown = function(ev){
				ev = mmlib.DOM.Event(ev);
				if (ev.key == 27){  /* ESC */
					removeBox();
					document.onkeydown = null;
				}
			}
		},
		displayLoader: function(){
			mmlib.Trans.Fade(overlay.show().self, {
				direction:'fadein', 
				endOpacity:75, 
				duration:500,
				onfinish: function(){
					box.applyCSS({
						width:loadingsize.x+'px',
						height:loadingsize.y+'px',
						left:(document.documentElement.clientWidth - (loadingsize.x+45))/2 + 'px',
						top:(document.documentElement.clientHeight - (loadingsize.y+45))/2 + 'px'
					}).insertSelf();
					loader.applyCSS({
						width:'auto', height:'auto', paddingTop:'34px', paddingLeft:'34px'
					}).setInnerHTML('<img src="images/loadingbig.gif" width="32" height="32" alt="..." style="display:block" />');
					if (mmlib.Util.isLowIE()){
						mmlib.DOM.WindowDispatcher.add('scroll', 
							function(){
								box.setAttribute('top', ((document.documentElement.scrollTop + (document.documentElement.clientHeight - box.offsetHeight())/2)+'px'));
							},
							scrollId
						);
					}
					mmlib.DOM.WindowDispatcher.add('resize',
						function(){
							box.applyCSS({
								left:(document.documentElement.clientWidth - box.offsetWidth())/2 + 'px',
								top:(document.documentElement.clientHeight - box.offsetHeight())/2 + 'px'
							});
						},
						resizeId
					);
					onshow(box);
				}
			});
			return this;
		},
		showContent: function(objective){
			objective = mmlib.Util.findElement(objective);
			if (objective){
				var fromwidth = loadingsize.x, towidth = size.x;
				var fromheight = loadingsize.y, toheight = size.y;
				
				loader.setInnerHTML('').appendChild(objective.removeSelf());
			
				doresize({
					startwidth: fromwidth, endwidth: towidth,
					startheight: fromheight, endheight: toheight,
					onfinish: function(){
						loader.applyCSS({
							overflow:'auto',
							padding:'0px',
							width: towidth+'px',
							height: toheight+'px'
						});
						objective.setStyle('display','block');
					}
				});
			}
			return this;
		}
	}
}

//-------------------------------------------------------------------------------------------------
//
mmlib.Snipets.ImageSwaper = function(container, swapduration, swapinterval, imagestoswap){
	var images = imagestoswap;
	var sizes = [];
	var thread = false;
	var cur = 0;
	var onimageswapped = arguments[4] || function(){};
	var image1, image2;
	
	container = mmlib.Util.findElement(container);
	
	function swapImages(){
		var next = cur+1;
		if (next >= images.length){
			next = 0;
		}
		cur = next;
		
		var showme, hideme;
		if (image2.Opacity == 100){
			showme = image1;
			hideme = image2;
		}
		else{
			showme = image2;
			hideme = image1;
		}

		showme.setInnerHTML('<img src="' + images[next] + '" width="' + sizes[next].width + '" height="' + sizes[next].height + '" alt="" />');
		
		mmlib.Trans.Fade(showme, {duration:swapduration+10, fps:25, direction:'fadein', onfinish: function(){
			onimageswapped();
		}});
		mmlib.Trans.Fade(hideme, {duration:swapduration, fps:25, direction:'fadeout'});
	}
	
	mmlib.ImageLoader(images).AddHandler("load", function(){
		for(var i=0; i<this.Images.length; i++){
			sizes.push({
				width: this.Images[i].width,
				height: this.Images[i].height
			});
		}
		
		container.setInnerHTML('<div id="image1"></div><div id="image2"></div>');
		image1 = mmlib.DOM.getElement('image1');
		image2 = mmlib.DOM.getElement('image2');
		image1.setOpacity(0);
		image2.setInnerHTML('<img src="' + this.Images[0].src + '" width="' + this.Images[0].width + 
			'" height="' + this.Images[0].height + '" alt="" />');
			
		thread = setInterval(swapImages, swapinterval);
	}).Load();
}

//
//  Expanded
////////////////////////////////////////////////////////////////////////////////////////////////////
String.prototype.equal = function(s){
	return (this.toUpperCase() === s.toUpperCase());
}

String.prototype.trim = function(){
	return this.replace(
		/^\s*(\S*(\s+\S+)*)\s*$/, "$1"
	);
}

String.prototype.empty = function(){
	return (this.replace(/(\s*|\n*|\r*|\t*|\f*|\v*|\0*)/gmi, "") === '');
}

Array.prototype.walk = function(callback){
	for (var i=0; i<this.length; i++){
		if (callback(this[i])){
			break;
		}
	}
}

Array.prototype.inarray = function(obj){
	for (var i=0; i<this.length; i++){
		switch (mmlib.Util.typeOf){
			case 'string':
				if (obj.equal(this[i])){
					return true;
				}
				break;
			default:
				if (obj == this[i]){
					return true;
				}
				break;
		}
	}
	return false;
}


//var dbg = mmlib.DOM.node().create('div')
//.applyCSS({position:'absolute', display:'block', width:'250px', height:'350px', backgroundColor:'gray', color:'black', overflow:'auto', zIndex:'65000', left:'0px', top:'0px'})
//.insertSelf();

//-------------------------------------------------------------------------------------------------
//
//   Univul.js
//
//   Autor Miroslav Marinković
//   Copyright (C) Fifoconsult, 2008.
//   programming@fifoconsult.co.yu
//   www.fifoconsult.co.yu
//
////

Univul = {};

Univul.Search = function(){
	var kw = mmlib.DOM.getElement('keyword').applyCSS({
		color:'#666666'
	});
	
	kw.addEvent('focus', function(ev){
		mmlib.DOM.Event(ev).stop();
		kw.setStyle('color', '#4a4a4a');
		if (kw.value().equal('pretraga...')){
			kw.element.value = '';
		}
	})
	.addEvent('blur', function(ev){
		mmlib.DOM.Event(ev).stop();
		kw.setStyle('color', '#666666');
		if (kw.value().empty()){
			kw.element.value = 'pretraga...';
		}
	})
	.addEvent('keypress', function(ev){
		ev = mmlib.DOM.Event(ev);
		if (ev.key == 13){
		  var frm = ev.src.element.form; 
		  frm.q.value = 'site:www.univul.com '+frm.qfront.value;
			frm.submit();
		}
		return true;
	});
	
	var swaps = ['images/flash.jpg','images/flash_2.jpg','images/flash_3.jpg'];
	mmlib.Snipets.ImageSwaper(mmlib.DOM.getElement('u_flash'), 2000, 20000, swaps);
	
	mmlib.DOM.walkElements('div.submenu', function(e){
		e.setOpacity(90);
	});
}();


Univul.Image = function(src){
	var onfinish = arguments[1] || function(){};
	var param = arguments[2] || {};
	var img = new Image();
	
	img.onload = img.onerror = img.onabort = function(){
		img.onload = img.onerror = img.onabort = null;
		onfinish(img, param);
	}
	
	img.src = src;
};


Univul.Galerija = {
	start: function(){
		for (var i = 0; i < __amFFFF.length; i++){
			for (var j = 0; j < __amFFFF[i].length; j++){
				Univul.Image(__amFFFF[i][j], function(o, p){
					mmlib.Trans.Fade(mmlib.DOM.getElement('load'+p), {direction:'fadeout', onfinish: function(obj){
						obj.removeSelf();
						mmlib.DOM.getElement('hold'+p).prependInnerHTML('<img src="'+o.src+'" width="'+o.width+'" height="'+o.height+'" class="galsl" alt="" id="img'+p+'" />').setStyle('color','#4a4a4a');
						mmlib.Trans.Fade(mmlib.DOM.getElement('img'+p).setOpacity(0).applyCSS({display:'block',cursor:'pointer'}), {direction:'fadein', 
							onfinish: function(o){
								o.addEvent('click', function(ev){
									ev = mmlib.DOM.Event(ev).stop();
									var Src = ev.src.element.src.replace(/^(.+\/\d+)\.jpg$/, "$1a.jpg");
									mmlib.Snipets.SSBox({rel:Src, handle:'image'}).display();
								})
								.addEvent('mouseover', function(ev){
									ev = mmlib.DOM.Event(ev).stop();
									ev.src.setOpacity(80);
								})
								.addEvent('mouseout', function(ev){
									ev = mmlib.DOM.Event(ev).stop();
									ev.src.setOpacity(100);
								});
							}
						});
					}}); 					
				}, i+'_'+j);
			}
		}
	}
};

Univul.Menus = function(){
	function show(divid){
		var eh = 0;
		switch(divid){
			case 'ssub1':
				eh = 100;
				break;
			case 'ssub2':
				eh = 40;
				break;
			default:
				break;
		}
		var el = mmlib.DOM.getElement(divid);
		el.applyCSS({display:'block', height:'1px'});
		mmlib.Trans.Change(el, {
			attribute:'height', startval:0, endval:eh, delay:100, onfinish: function(o){
				o.addEvent('mouseout', function(ev){
					ev = mmlib.DOM.Event(ev).stop();
					hide(o.element.id, ev);
				});
			}
		});
	}
	
	function hide(divid, ev){
		var div = mmlib.DOM.getElement(divid);
		div.setStyle('display', 'none');
	}
	
	mmlib.DOM.getElement('lisub1')
	.addEvent('mouseover', function(ev){
		mmlib.DOM.Event(ev).stop();
		show('ssub1');
	})
	.addEvent('mouseout', function(ev){
		ev = mmlib.DOM.Event(ev).stop();
		hide('ssub1', ev);
	});
	
	mmlib.DOM.getElement('lisub2')
	.addEvent('mouseover', function(ev){
		mmlib.DOM.Event(ev).stop();
		show('ssub2');
	})
	.addEvent('mouseout', function(ev){
		ev = mmlib.DOM.Event(ev).stop();
		hide('ssub2', ev);
	});
}();
