/*
	通用jQuery SELECT 插件
	seeting:
		fn:				回调函数,
		clsSelt:		选择框样式,
		clsSeltMu:		下拉框样式,
		clsSeltItem:	选择项样式,
		clsSeltOver:	鼠标经过项样式,
		clsSeltSelted: 	选中项样式
	//-------------------------------
	版本：v1.5
	编写：詹衡
	日期：2009年12月16日
*/
(function($) {
    $.fn.extend({
        //生成GUID
        newGuid: function() {
            var guid = "";
            for (var i = 1; i <= 32; i++) {
                var n = Math.floor(Math.random() * 16.0).toString(16);
                guid += n;
                if ((i == 8) || (i == 12) || (i == 16) || (i == 20))
                    guid += "_";
            }
            return guid;
        },
        //下拉框
        TGSelect: function(setting) {
            var def = {
                fn: null,
                clsSelt: "getSelectSelt",
                clsSeltMu: "getSelectSeltMu",
                clsSeltItem: "getSelectSeltMuItme",
                clsSeltOver: "getSelectSeltMuItmeOver",
                clsSeltSelted: "getSelectSeltMuItmeSelected"
            };
            var ps = $.extend(def, setting);
            var myenable = true;

            //更新选中项显示函数
            function setSelected(obj) {
                var SeltMuId = obj.attr("id") + "_Selt_Mu";
                var SeltObj = $("#" + obj.attr("id") + "_Selt");
                var nowObj = $("#" + obj.attr("id") + "_Selt_Mu div[value=" + obj.val() + "]");
                //处理被选样式
                $("div[name=" + SeltMuId + "_option]").find("a").removeClass(ps.clsSeltSelted);
                nowObj.find("a").addClass(ps.clsSeltSelted);
                //设置宽度
                SeltObj.css("width", obj.width() + 4);
                //设置显示文本
                SeltObj.html(obj.find("option:selected").text());
                
                if (obj.find("option").size() > 10) {
                    $("#" + SeltMuId).css({ height: "200px", "overflow": "auto" });
                    if ($.browser.msie) {
                        $("#" + SeltMuId).css("overflow-x", "hidden");
                    }
                }
            }

            //新增选项(多对象时只添加第一对象)
            this.Add = function(text, val) {
                var myobj = $($(this).get(0));
                var SeltId = myobj.attr("id") + "_Selt";
                var SeltMuId = myobj.attr("id") + "_Selt_Mu";
                //--------------------------
                var opid = "O_" + $(this).newGuid();
                //插入option
                myobj.append("<option id='" + opid + "' value='" + val + "'>" + text + "</option>");
                //插入选项
                $("#" + SeltMuId).append("<div op='" + opid + "' name='" + SeltMuId + "_option' value=" + val +
                    "><a href='#here' style='width:100%;display:block;text-decoration:none'>" + text + "</a></div>");
                //设置样式
                $("#" + SeltMuId + " div[op=" + opid + "]").find("a").addClass(ps.clsSeltItem);
                
            };
			
			this.Refresh=function(){
				var myobj = $($(this).get(0));
				//更新选中项显示
                setSelected(myobj);
			}
			
            //根据值移除选项(多对象时只添加第一对象)
            this.Remove = function(val) {
                var myobj = $($(this).get(0));
                var SeltId = myobj.attr("id") + "_Selt";
                var obj = $("#" + myobj.attr("id") + "_Selt_Mu div[value=" + val + "]");
                obj.remove();
                $("#" + obj.attr("op")).remove();
                //更新选中项显示
                setSelected(myobj);
            };

            //清空选项
            this.Clear = function() {
                var myobj = $($(this).get(0));
                var SeltId = myobj.attr("id") + "_Selt";
                var SeltMuId = myobj.attr("id") + "_Selt_Mu";
                myobj.empty();
                $("#" + SeltId).empty();
                $("#" + SeltMuId).empty();
            };

            //设定当前选择项但不触发相关事件及回调函数(多对象时只添加第一对象)
            this.Selected = function(val) {
                var myobj = $($(this).get(0));
                var obj = $("#" + $($(this).get(0)).attr("id") + "_Selt_Mu div[value=" + val + "]");
                //设置选中项
                myobj.width(); //处理IE6BUG
                var opt = myobj.find("#" + obj.attr("op"));
                opt.attr("selected", true);
                //更新选中项显示
                setSelected(myobj);
            };

            //设定当前选择项并触发相关事件(多对象时只添加第一对象)
            this.ChangeTo = function(val) {
                $("#" + $($(this).get(0)).attr("id") + "_Selt_Mu div[value=" + val + "]").click();
            }

            //设定是否只读
            this.Enable = function(b) {
                if (b) {
                    myenable = true;
                } else {
                    myenable = false;
                }
            };

            //设定是否显示
            this.Visible = function(b) {
                var myobj = $($(this).get(0));
                var SeltId = myobj.attr("id") + "_Selt";
                if (b) {
                    $("#" + SeltId).show();
                } else {
                    $("#" + SeltId).hide();
                }
            };

            this.each(function() {
                if ($(this).get(0).tagName != "SELECT") { return false };
                //循环匹配项目
                //--------------------------
                var myobj = $(this);
                //选择框ID名
                var SeltId = myobj.attr("id") + "_Selt";
                //下拉框ID名
                var SeltMuId = myobj.attr("id") + "_Selt_Mu";
                //--------------------------
                //创建下拉层
                myobj.after("<div id='" + SeltMuId + "'></div>");
                //创建选择框
                myobj.after("<div id='" + SeltId + "'></div>");
                //选择框对象
                var SeltObj = $("#" + SeltId);
                //下拉框对象
                var SeltMuObj = $("#" + SeltMuId);
                //隐藏控件
                $(this).hide();
                //设置选择框样式
                SeltObj.addClass(ps.clsSelt);
                //隐藏下拉层
                SeltMuObj.hide();
                //设置下拉层样式
                SeltMuObj.addClass(ps.clsSeltMu);
                //--------------------------
                //绑定选择框点击事件
                SeltObj.click(function() {
                    if (myenable) {
                        SeltMuObj.css(
							{ top: $(this).offset().top + $(this).height(),
							    left: $(this).offset().left,
							    width: $(this).width(),
							    position: "absolute",
							    "z-index": 800
							}
						);
                        //触发原始选择框焦点事件
                        myobj.focus();
                        SeltMuObj.slideDown("fast", function() {
                            $("html").one("click", function() {
                                SeltMuObj.hide();
                            });
                        });
                    }
                });

                //--------------------------
                //填充下拉层数据
                myobj.find("option").each(function() {
                    var opid = "O_" + $(this).newGuid();
                    $(this).attr("id", opid);
                    SeltMuObj
					.append("<div op='" + opid + "' name='" + SeltMuId + "_option' value=" + $(this).val() +
					    "><a href='#here' style='width:100%;display:block;text-decoration:none'>" + $(this).text() + "</a></div>");
                    //设置选项样式
                    $("#" + SeltMuId + " div[op=" + opid + "]").find("a").addClass(ps.clsSeltItem);
                });
                //绑定下拉层事件
                SeltMuObj.hover(
					function() {
					    $("html").unbind("click");
					},
					function() {
					    $("html").one("click", function() {
					        SeltMuObj.hide();
					    });
					}
				);
                //--------------------------
                //选项点击事件
                $("div[name=" + SeltMuId + "_option]").live("click", function() {
                    //隐藏下拉层
                    SeltMuObj.hide();
                    //触发原始选择框获得焦点事件
                    myobj.focus();
                    //设置选中项
                    myobj.width(); //处理IE6BUG              
                    var opt = myobj.find("#" + $(this).attr("op"));
                    opt.attr("selected", true);
                    //更新选中项显示
                    setSelected(myobj);
                    //选择项点击回调函数的处理
                    if (ps.fn != $.undefined) {
                        $.fn.getSelect_callback = ps.fn;
                        opt.getSelect_callback();
                    }
                    //触发原始选择框焦点丢失事件
                    myobj.blur();
                    myobj.change();
                });
                var SeltItme = $("div[name=" + SeltMuId + "_option]");
                //鼠标进入选项事件		
                SeltItme.live("mouseover", function() {
                    $(this).find("a").addClass(ps.clsSeltOver);
                });
                //鼠标移出选项事件
                SeltItme.live("mouseout", function() {
                    $(this).find("a").removeClass(ps.clsSeltOver);
                });
                //更新选中项
                setSelected(myobj);
            });
            return this;
        }
    });
})(jQuery);
