/* 20100203-1550 */
/******************************************************************************
 * Combobox 2.0 - Terra Networks - Equipe Webdev
 * 2008
 * Modulo dependente dos modulos Scrolling, Clickout, ElementPosition e Tabs
 *
 * COMO UTILIZAR
 * 
 * Inserir no HTML um select envolvido por uma div com o atributo class="combobox"
 *
 *
 * PARAMETROS
 *
 * Para setar uma label inicial no combo o atributo title no select deve ser setado com este valor (Ex.: "Selecione um numero")
 * Para um option sair marcado deve ser adicionado os atributos selected="selected" e class="selected" na opcao
 * Adicionando a classe nowrap em um option, ele não será quebrado automaticamente de acordo com o tamanho da combobox
 * Adicionando a classe cmb-tabs na div da combo, ela assume comportamento de abas
 * Adicionando a classe cmb-jumpmenu na div da combo e url no value dos options, ela assume comportamento de jumpmenu
 * A combobox está preparada para aceitar optgroups, basta colocá-lo com uma label. Caso ela tenha link, pode ser inserido como classe no optgroup
 *
 ******************************************************************************/

(function($) {

	$.fn.extend({

		// Combobox
		combobox: function() {
			selector = this;
			$(selector).each(function(i) {

				var objCombo = $(this);
				var selectCombo = objCombo.find("select");
				var cmbTabs = false;
				var hrefJumpMenu = "";
				var labelOptgroup = "";

				// Tabs
				if (objCombo.hasClass("cmb-tabs")) {
					cmbTabs = true;
				}
				// Jump menu
				if (!objCombo.hasClass("cmb-jumpmenu")) {
					hrefJumpMenu = "#";
				}

				if (selectCombo.size() > 0) {
					// List
					var listValues = "";
					selectCombo.find("option").each(function(i) {

						// Optgroup
						if ($(this).parents("optgroup").size() > 0) {
							if ($(this).parents("optgroup").attr("label") != "") {
								// Link
								if ($(this).parents("optgroup").attr("class")) {
									listValues += "<li class=\"cmb-group"+($(this).parents("optgroup").hasClass("selected") ? " selected" : "")+"\"><a href=\""+hrefJumpMenu+$(this).parents("optgroup").attr("class").replace(" selected","")+"\">"+$(this).parents("optgroup").attr("label")+"</a></li>";
								} else {
									listValues += "<li class=\"cmb-group\">"+$(this).parents("optgroup").attr("label")+"</li>";
								}
								labelOptgroup = $(this).parents("optgroup").attr("label");
								$(this).parents("optgroup").attr("label","");
							}
							listValues += "<li class=\"cmb-subitem"+($(this).hasClass("selected") ? " selected" : "")+"\"><a href=\""+hrefJumpMenu+($(this).attr("value") || $(this).html())+"\">&bull; "+$(this).html()+"</a>";
						} else {
							listValues += "<li"+($(this).hasClass("selected") ? " class=\"selected\"" : "")+"><a href=\""+hrefJumpMenu+($(this).attr("value") || $(this).html())+"\" class=\""+$(this).attr("class")+"\">"+$(this).html()+"</a>";
						}
					});

					// Attributes
					var nameField = selectCombo.attr("name");
					var idField = selectCombo.attr("id");

					// Label n' value
					var selectedOption = objCombo.find(".selected");

					if (selectedOption.is("optgroup")) {
						var labelField = labelOptgroup;
						var valueField = selectedOption.attr("class").replace(" selected","");
					} else {
						var labelField = selectedOption.size() > 0 ? selectedOption.html() : ( selectCombo.attr("title") ? selectCombo.attr("title") : selectCombo.find("option:first").html() );
						var valueField = selectedOption.size() > 0 ? (selectedOption.attr("value") || selectedOption.html()): ( selectCombo.attr("title") ? "" : (selectCombo.find("option:first").attr("value") || selectCombo.find("option:first").html()) );
					}

					//labelField = wrapValue(labelField, objCombo);

					// Tabs
					var attributesTabs = "";
					if (cmbTabs) {
						attributesTabs = " class=\"tab-list\"";
					}

					objCombo.html("<input type=\"hidden\" name=\""+nameField+"\" id=\""+idField+"\" value=\""+valueField+"\" />" +
						"<div class=\"cmb-value\"><div>"+labelField+"</div><span>&raquo;</span></div>" +
						"<div class=\"scr-listvalues clickout\">" +
							"<div class=\"scrolling scr-vertical\">" +
								"<div class=\"scr-content\">" +
									"<div class=\"scr-innercontent\">" +
										"<ul"+attributesTabs+">" +
											listValues +
										"</ul>" +
									"</div>" +
								"</div>" +
							"</div>" +
						"</div>");

					// Adjust height
					var objListValues = objCombo.find(".scr-listvalues");
					var objInnerContent = objCombo.find(".scr-innercontent");

					objListValues.show();
					if (objCombo.find(".scr-content").height() > objInnerContent.height()) {
						objCombo.find(".scr-content, .scrolling").height(objInnerContent.height());
					}
					objListValues.hide();

				// Links in body
				} else if (objCombo.find(".cmb-list").size() > 0) {
					objCombo.addClass("cmb-jumpmenu");
					objCombo.append("<div class=\"scr-listvalues clickout\">" +
							"<div class=\"scrolling scr-vertical\">" +
								"<div class=\"scr-content\">" +
									"<div class=\"scr-innercontent\">" +
									"</div>" +
								"</div>" +
							"</div>" +
						"</div>");
					objCombo.find(".scr-innercontent").append(objCombo.find(".cmb-list").removeClass("cmb-list"));

					// Optgroup
					objCombo.find("ul ul li").addClass("cmb-subitem").find("a").prepend("&bull; ");

					// Adjust height
					var objListValues = objCombo.find(".scr-listvalues");
					var objInnerContent = objCombo.find(".scr-innercontent");

					objListValues.show();
					if (objCombo.find(".scr-content").height() > objInnerContent.height()) {
						objCombo.find(".scr-content, .scrolling").height(objInnerContent.height());
					}
					objListValues.hide();
				}



				/*
				 * Events
				 */

				// Show hide combo
				objCombo.find(".cmb-value").unbind("click").click(function() {
					toggleCombobox($(this).parent());
				});

				// Select a value
				objCombo.find(".scr-listvalues a").unbind("mouseup").mouseup(function() {
					selectComboValue($(this));
					return false;
				});
				
				objCombo.find(".scr-listvalues a").click(function() {
					if (!objCombo.hasClass("cmb-jumpmenu")) {
						return false;
					}
				});

			});



			/*
			 * Functions
			 */
	
			// Show hide combo
			/*
			 * PARAMETERS
			 * - selector (.combobox)
			 */
			function toggleCombobox(selector) {
				var objCombo = $(selector);
				var objListValues = objCombo.find(".scr-listvalues");
				$(".clickout").not(objListValues).hide().parent().find(".cmb-value").removeClass("active");

				objListValues.toggle();

				// Reset position
				if (objCombo.find(".scr-bar").size() > 0) {
					objCombo.find(".scr-content").get(0).scrollTop = 0;
					objCombo.find(".scr-bar").css("top","0");
				}

				// toggle class
				if (objListValues.is(":visible")) {
					objCombo.find(".cmb-value").addClass("active");
					// Position
					objListValues.elementPosition(objCombo.offset().top + objListValues.height() + objCombo.find(".cmb-value").height(), (objListValues.height()+objCombo.find(".cmb-value").height() + 10 /* padding + border */)*(-1));
				} else {
					objCombo.find(".cmb-value").removeClass("active");
				}
			}

			// Select value
			/*
			 * PARAMETERS
			 * - selector (a)
			 */
			function selectComboValue(selector) {
				var objCombo = $(selector).parents(".combobox");
				var textValue = $(selector).html();
				if ($(selector).parent().hasClass("cmb-subitem")) {
					textValue = textValue.substr(2);
				}

				// wrap
				textValue = $(selector).hasClass("nowrap") ? textValue : wrapValue(textValue, objCombo);

				toggleCombobox(objCombo.find("scr-listvalues").hide());
				objCombo.find(".cmb-value").removeClass("active");
				objCombo.find(".cmb-value div").html(textValue);
				var expr = /#.*/;
				if (objCombo.find("input:hidden").size() > 0)
					objCombo.find("input:hidden").val(expr.exec($(selector).attr("href")).toString().replace("#",""));
			}

			function wrapValue(textValue, objCombo) {
				var maxChars = Math.floor((objCombo.width()-36)/7);
				if (textValue.length > maxChars) {
					textValue = textValue.substring(0,maxChars-2)+"...";
				}
				return textValue;
			}
		}
	});
})(jQuery);

// $(".combobox").combobox();