/*
 * jQuery.selectable.js
 *
 * Copyright (c) 2008 nori (norimania@gmail.com)
 * Licensed under the MIT
 * jQuery required (tested on 1.2.6)
 *
 * $Date: 2008-09-14 02:34
 */

jQuery.selectable = function(select,options,callback){
	/* declare options */
	var c = $.extend({
		style: "selectable", // or "simpleBox"
		set: "show", // "show" or "slideDown" or "fadeIn"
		out: "hide", // "hide" or "slideUp" or "fadeOut"
		inDuration: "normal", // "slow", "normal", "fast" or 0~1
		outDuration: "normal",
		opacity: 1, // pulldown mat
		pos: 0
	},options);
	
	/* set attrs */
	var attrs = {
		id: $(select).attr("id"),
		name: $(select).attr("name"),
		cl: $(select).attr("class")
	}
			
	/* rewrite label attr[for] */
	$("label[for='"+attrs.id+"']").attr("for",attrs.id+"_dammy");
	
	/* declare the flag */
	var flag = ($("optgroup",select).length>0) ? true : false;
															 
	/* get optgroup & option elements */
	if(flag){
		var optgroup = $("optgroup",select);
		var option = new Array();
		for(var i=0;i<optgroup.length;i++){
			option[i] = $("option",optgroup[i]);
		}
	}else{
		var option = $("option",select);
	}
		
	/* generate input elements */
	var h_input = document.createElement("input");
	var m_input = document.createElement("input");
	var style = (c.style.match(/simpleBox/)) ? "sBox" : "sctble";
	$(h_input).attr({
		id: attrs.id,
		name: attrs.name,
		type: "hidden"
	}).insertAfter(select);
	$(m_input).attr({
		id: attrs.id+"_dammy",
		name: attrs.name+"_dammy",
		type: "text"
	}).addClass("sctble_display").addClass(style).addClass(attrs.cl).insertAfter(select);
	
	/* remove select elements */
	$(select).remove();
	
	/* set target(mat) position */
	function setPos(t){
		var pos = $(m_input).offset();
		$(t).css({
			top: pos.top + $(m_input).height()*1+c.pos,
			left: pos.left
		});
	};
				
	/* generate mat */
	var mat = document.createElement("div");
	$(mat).attr({
		id: attrs.id+"_mat"
	}).addClass(style).addClass(attrs.cl);
	var generateAnchor = function(obj,par){
		var a = document.createElement("a");
		$(par).append(a);
		$(a).text(obj.text()).attr({
		/*改造*/
			href: "http://www.gakuwari-club.com/?cat="+obj.val(),
			name: encodeURI(obj.text())
		});
		if(obj.is(":selected")){
			$(m_input).val(obj.text());
			$(h_input).val(obj.text());
			$(a).addClass("selected");
		}
		if(obj.hasClass("br")){
			var br = document.createElement("br");
			$(br).insertAfter(a);
		}
	}
	if(flag){
		var dl = document.createElement("dl");
		for(var j=0;j<optgroup.length;j++){
			var dt = document.createElement("dt");
			$(dt).text($(optgroup[j]).attr("label"));
			var dd = document.createElement("dd");
			for(var k=0;k<option[j].length;k++){
				generateAnchor($(option[j][k]),dd);
			}
			$(dl).append(dt).append(dd);
		}
		$(mat).append(dl).addClass("optg");
	}else{
		var p = document.createElement("p");
		for(var j=0;j<option.length;j++){
			generateAnchor($(option[j]),p);
		}
		$(mat).append(p).addClass("nooptg");
	}
	$("body").append(mat);
	if(document.all && typeof document.body.style.maxHeight == "undefined"){
		if(c.height<$(mat).height()) $(mat).css("height",c.height);
	}else{
		$(mat).css("maxHeight",c.height);
	}
	$(mat).addClass("sctble_mat").css({
		position: "absolute",
		zIndex: 1000,
		display: "none"
	});
	$("*:first-child",mat).addClass("first-child");
	$("*:last-child",mat).addClass("last-child");
	
	/* event apply */
	var hide = function(tm){
		switch(c.out){
			case "slideUp":
			tm.slideUp(c.outDuration);
			break;
			case "fadeOut":
			tm.fadeOut(c.outDuration);
			break;
			default:
			tm.hide();
			break;
		}
	}
	var show = function(target){
		$(".sctble_display").removeAttr("disabled");
		$(target).attr("disabled","disabled");
		hide($(".sctble_mat"));
		switch(c.set){
			case "slideDown":
				$(mat).slideDown(c.inDuration).css("opacity",c.opacity);
				break;
			case "fadeIn":
				$(mat).css({
					display: "block",
					opacity: 0
				}).fadeTo(c.inDuration,c.opacity);
				break;
			default:
				$(mat).show().css("opacity",c.opacity);
				break;
		}
	}
	var remove = function(){
		$("input.hover").removeClass("hover");
		$("input.focus").removeClass("focus");
	}
	$(m_input).click(function(event){
		setPos(mat);
		$("input.hover").not(this).removeClass("hover");
		$("input.focus").not(this).removeClass("focus");
		show(this);
		event.stopPropagation();
	}).keyup(function(event){
		setPos(mat);
		show(this);
		event.stopPropagation();
	}).focus(function(){
		$(this).addClass("focus");
	}).blur(function(){
		remove();
	}).hover(function(){
		$(this).addClass("hover");
	},function(){
		$(this).removeClass("hover");
	});
	$(mat).click(function(event){
		event.stopPropagation();
	});
	$("body,a").click(function(event){
		remove();
		$(m_input).removeAttr("disabled");
		$("input.focus").removeClass("focus");
		hide($(mat));
	});
	$("a",mat).click(function(){
	/*改造*/
		$(m_input).val(decodeURI($(this).attr("name")));
		$(h_input).val($(this).attr("name"));
		$(".selected",mat).removeClass("selected");
		$(this).addClass("selected");
		$(m_input).removeAttr("disabled").removeClass("hover").removeClass("focus");
		hide($(mat));
		if(callback) callback();
		return true;
	});
}

jQuery.fn.selectable = function(options,callback){	
	$(this).each(function(){jQuery.selectable(this,options,callback)});
}
