//	-*- coding: UTF-8 -*-
// popmenu.js - JavaScript
// Copyright 2010 Mizutori Crafts. All rights reserved.
// Author: Mizutori Tetsuya &lt;support@mizutori.net&gt;
// No part of this program may be reproduced or transmitted in any form or 
// by any means without permission from the author. Mizutori Crafts.
//
// Date: June 26, 2010
// Version: 1.00; June 26, 2010

// Usage:
/**
<head>
	<script type="text/javascript" src="../scripts/jquery.js"></script>
	<script type="text/javascript" src="../scripts/jtools.js"></script>
	<script type="text/javascript" src="../scripts/popmenu.js"></script>
	<script type="text/javascript" src="../scripts/pane_data.js"></script>
</head>
<body>
</body>
*/

// Constants and Variables:

// menu data array
var kQIAJ_POPMENU_ARRAY = {
'tag': {
	href:"path",label:"Title",
	items:[
		{ key:"page01", href:"path",label:"Title" },
		{ key:"page02",href:"path",label:"Title" },
		null ]
	},
'end':null
};

if (xtnd_zindex == undefined) { var xtnd_zindex = 1000; }

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// popmenu_loader
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

(function($) { // create private scope (inside you can use $ instead of jQuery)

	var timers = {};
	var remains = new Array();

	// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	// prototype: popSubmenu
	// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	// define the plugin function
	$.fn.popSubmenu = function(options) {
		// parse options
		var opts = jQuery.extend({}, jQuery.fn.popSubmenu.defaults,options);
		var task_hit = (opts.task != undefined) ? opts.task : "";
		var page_hit = (opts.page != undefined) ? opts.page : "";

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.createNewPane()
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// generate a new pane
		function createNewPane(hook_obj) {

			// retrieve hook_obj info. if not found, do nothing.
			var hook_obj_id = hook_obj.attr('id'); // id = "ID_0001"
			var pane_name = hook_obj.attr('xtnd'); // pane_name = "popmenu_toc"
			var tag = "";
			var pane_data = null;
			if (pane_name.search(/^popmenu_(.+)$/) != -1) {
				tag = RegExp.$1; // Ex. "toc" from "popmenu_toc"
				pane_data = kQIAJ_POPMENU_ARRAY[tag];
			}
			if ((pane_data == undefined) || (pane_data == null)) { return null; }

			// get task
			var task = (pane_data.task != undefined) ? pane_data.task : tag;

			// find last item
			var tuple_last = null;
			for (var k in pane_data.items) {
				var tuple = pane_data.items[k];
				if (tuple == null) { continue; }
				tuple_last = tuple;
			}

			// generate pane html
			var pane_html = "";
			pane_html += '<div class="popmenubox">';
			pane_html += '<ul>';
			for (var k in pane_data.items) {
				var tuple = pane_data.items[k];
				if (tuple == null) { continue; }
				var key = tuple.key;
				var task_ = (tuple.task != undefined) ? tuple.task : task;
				var href = tuple.href;
				href = href.replaceRootdir();
				var label = tuple.label;
				var style = (tuple == tuple_last ? "item_last" : "");
				if ((task_ == task_hit) && (key == page_hit)) { style += " item_hit"; }
				pane_html += '<li class="' + style + '"><a href="' + href + '" title="'+label+'">' + label + '</a></li>';
			}
			pane_html += '</ul>';
			pane_html += '</div>';

		//	var pane_obj = jQuery('<ul style="display:none;"><li>Item 01</li></ul>');
			var pane_obj = jQuery(pane_html);

			// set timer
		//	setTimer(hook_obj,function() { disposePane(hook_obj,pane_obj); });

			return pane_obj;
		}

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.setSemaphor(), isSemaphor()
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// set semaphor
		function setSemaphor(hook_obj,isStatus) {
			if (isStatus == undefined) { isStatus = true; }
			jQuery.data(hook_obj.get(0),"popSubmenu", { hasPopSubmenu:isStatus });
		}

		function isSemaphor(hook_obj) {
			return ( jQuery.data(hook_obj.get(0),"popSubmenu").hasPopSubmenu == true );
		}

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.setTimer(), clearTimer()
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// set timer
		// Usage:
		//	setTimer(hook_obj,function () { ... });
		function setTimer(hook_obj,callback) {
			var hook_obj_id = hook_obj.attr('id'); // id = "ID_0001"
			timers[hook_obj_id] = setTimeout(callback,3000);
		}

		// clear timer
		function clearTimer(hook_obj) {
			var hook_obj_id = hook_obj.attr('id'); // id = "ID_0001"
			if (timers[hook_obj_id] != undefined) {
				clearTimeout(timers[hook_obj_id]);
				timers[hook_obj_id] = null;
			}
		}

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.disposePane()
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// dispose pane
		function disposePane(hook_obj,pane_obj) {
			var input_id = hook_obj.attr('id'); // id = "ID_0001"
			pane_obj.hide(100,function () {
				pane_obj.remove();
				pane_obj = null;
			});
			// clear semaphore
			setSemaphor(hook_obj,false);
			// clear timer
			clearTimer(hook_obj);
		}

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.findPosition()
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// get the real position of the object
		function findPosition(obj) {
			var curleft = 0;
			var curtop = 0;
			if (obj.offsetParent) {
			//	window.alert(obj.tagName);
				do {
					curleft += obj.offsetLeft;
					curtop += obj.offsetTop;
				} while (obj = obj.offsetParent);
				return [curleft,curtop];
			} else {
				return false;
			}
		}

		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// popSubmenu.return
		// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		// iterate the matched nodeset
		return this.each(function() {
			var hook_obj = jQuery(this); // hook element
			var pane_obj;
			setSemaphor(hook_obj,false);

			// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
			// popSubmenu.click
			// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
			// open a pain on the click event
		//	hook_obj.click(function (e) {
			hook_obj.mousemove(function (e) {
				if (! isSemaphor(hook_obj)) {
					setSemaphor(hook_obj,true);
					pane_obj = createNewPane(hook_obj);
					jQuery("body").append(pane_obj);

					// control other hook objs
					while (remains.length > 0) {
						var tuple = remains.pop();
						disposePane(tuple[0],tuple[1]);
					}
					remains.push(new Array(hook_obj,pane_obj));

					// set timer
					setTimer(hook_obj,function() { disposePane(hook_obj,pane_obj); });

					// mouse position
					var mouseX = e.pageX;
					var mouseY = e.pageY;

					// show pane
					var pos = findPosition(hook_obj.get(0));
				//	var x_ = (parseInt(opts.x) ? parseInt(opts.x) : 0) + pos[0];
				//	var y_ = (parseInt(opts.y) ? parseInt(opts.y) : 0) + pos[1];
					var x_ = (opts.x != undefined ? opts.x : 0) + pos[0];
					var y_ = (opts.y != undefined ? opts.y : 0) + pos[1];
					if (opts.y < 0) { y_ -= pane_obj.height(); } // pop below if minus

				//	pane_obj.css({position:'absolute',top:y_+"px",left:x_+"px",width:width_+"px"});
					pane_obj.css({position:'absolute',top:y_+"px",left:x_+"px"});
					pane_obj.css({ 'z-index':++xtnd_zindex });
					pane_obj.show(100);
				}

				// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
				// popSubmenu.click.hover
				// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
				// hold to show a pain when the mouse is over
				pane_obj.hover(function (e) {
					// on callback
					clearTimer(hook_obj);
				}, function (e) {
					// off callback
					disposePane(hook_obj,pane_obj);
				});

			}); /* end of hook_obj.click() */
		}); /* end of return */
	}; /* end of $.fn.popSubmenu */

	// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	// prototype: popSubmenu.defaults
	// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	jQuery.fn.popSubmenu.defaults = {
		// offset from the top left corner of the input element
		x : 0, // must be in px
		y : 20, // must be in px
		task : "",
		page : ""
	}; /* end of jQuery.fn.popSubmenu.defaults */

})(jQuery);
//}

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// popmenu_setup
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

function popmenu_setup(idx) {
//	window.alert("popmenu_setup="+idx);

	var hook_obj = jQuery(this);
	var hook_obj_id = hook_obj.attr('id'); // id = "ID_0001"
	var pane_name = hook_obj.attr('xtnd'); // pane_name = "popmenu_toc"

	// retrieve hit info from jtools.js
	var section = jt_get_pref("section"); // Ex. {chap:"corp01",page:"page03"}
	var task_ = section["chap"];
	var page_ = section["page"];
//	window.alert(task_ + " " + page_);

//	var top_ = hook_obj.height() - 12; // plus for pop below
//	var top_ = -10; // minus for pop above
	var top_ = 22; // minus for pop above
	var left_ = 0;
	hook_obj.popSubmenu({x:left_,y:top_,task:task_,page:page_});
}

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// popmenu_init
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Usage:
//	<a href="#" style="width:100px;" id="ID_0001" xtnd="popmenu_area" />

function popmenu_init() {
//	window.alert("popmenu_init");

	// find <a xtnd="..." /> elements and setup them
	jQuery('a[xtnd^="popmenu_"]').each(popmenu_setup);
}

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// main functions:
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

//window.onload = popmenu_init;
$(document).ready(popmenu_init);

// end of javascript

