(function($) {

$.fn.ulmenu = function(options) {

	var settings = $.extend({
		hover: 'hoverClass',
		active: 'selected',
		duration: 100
	}, options || {});

	return this.each(function(){

		var me = $(this);
		var ele = this;

		ele.oframe = null; /** singleton */

		if( $.browser.msie && $.browser.version < 7 ) {
			//~ console.log("18: $.browser.version: " + $.browser.version);
			if( !(ele.oframe = $.Util.gid('c3dfc6c9be16d987aw')) ) {
				ele.oframe = $('<iframe id="c3dfc6c9be16d987aw" src="javascript:void(null);" scrolling="no" frameborder="0" style="border:0px solid #fff;padding:0;display:none;position:absolute;z-index:99"></iframe>')
				.appendTo('body').get(0);
			}
		}

		$('li', ele).each(function() {
			var eleLi = this;
			eleLi.pos = $.Util.getxy(eleLi);
			eleLi.siz = $.UIObject.getAbsoluteSize(eleLi);
			/** link to its parent and child UL element accordingly */
			eleLi.upper = null;
			eleLi.lower = null;
			//~ console.log('18: pos: '+eleLi.pos.left+','+eleLi.pos.top);
			//~ console.log('19: size: '+eleLi.siz.width+','+eleLi.siz.height);

			$(eleLi).hover(
				function() {
					//~ console.log("33: eleLi: "+eleLi.nodeName);
					eleLi.pos = $.Util.getxy(eleLi);
					eleLi.lower = $('ul', eleLi)
					.css({left: eleLi.pos.left+eleLi.siz.width-2+'px', top: eleLi.pos.top+13+'px'})
					.show().get(0);

					//~ console.log("41: eleLi:"+eleLi.nodeName);
					$(eleLi).addClass(settings.hover);

					if( ele.oframe ) {
						if( eleLi.lower ) {
							$(ele.oframe)
							.css({left: eleLi.pos.left+eleLi.siz.width-2+'px', top: eleLi.pos.top+'px', width:eleLi.lower.offsetWidth+'px', height:eleLi.lower.offsetHeight+'px'})
							.show();

							$('li', eleLi.lower).each(function(){
								this.upper = eleLi.lower; /** relink the relationship of parent and child */
							});
						}
						else if( eleLi.upper ) {
							//~ console.log("55: eleLi.upper: "+eleLi.upper);
							$(ele.oframe).show();
						}
					}
				},

				function() {
					$(eleLi).removeClass(settings.hover);
					$('ul', eleLi).hide();
					if( ele.oframe ) {
						$(ele.oframe).hide();
					}
				}
			);

			// highlight current section
			var eleA = $('a', eleLi)[0];
			if( document.location.href.indexOf(eleA.href) != -1 ) {
				//~ console.log("78: LI.href: " + eleA.href);
				$(eleA).addClass(settings.active);

				var peleA = eleA.parentNode.parentNode.parentNode.firstChild;
				if( peleA.nodeType == 3 ) { // skip textnode in Firefox
					peleA = eleA.parentNode.parentNode.parentNode.childNodes[1];
				}
				$(peleA).addClass(settings.active);
			}
		});
	});
};

})(jQuery);

