/*
SortSelect
Plugin jQuery
Version 1.1
2008-07-23
By Martin Bouladour
For Intelliance Agence Web
martin.bouladour@wanadoo.fr
*/

$.sortSelect = {
	normalizeChar: function(c) {
		var c = c.toLowerCase() ;
		switch (c) {
			case "340": case "\341": case "\342": case "\343": case "\344": case "\345": case "\346":
				return "a" ;
				break ;
			case "347":
				return "c" ;
				break ;
			case "350": case "\351": case "\352": case "\353":
				return "e" ;
				break ;
			case "354": case "\355": case "\356": case "\357":
				return "i" ;
				break ;
			case "361":
				return "n" ;
				break ;
			case "362": case "\363": case "\364": case "\365": case "\366": case "\370":
				return "o" ;
				break ;
			case "371": case "\372": case "\373": case "\374":
				return "u" ;
				break ;
			case "375": case "\377":
				return "y" ;
				break ;
			default:
				return c ;
				break ;
		}
		return c ;
	},
	sortChars: function(a, b) {
		var aIsNumber = (parseFloat(a) == a) ;
		var bIsNumber = (parseFloat(b) == b) ;
		if (aIsNumber && bIsNumber) {
			return a - b ;
		} else if (!aIsNumber && bIsNumber) {
			return 1 ;
		} else if (aIsNumber && !bIsNumber) {
			return -1 ;
		} else if (!aIsNumber && !bIsNumber) {
			var a = $.sortSelect.normalizeChar(a) ;
			var b = $.sortSelect.normalizeChar(b) ;
			if (a > b) {
				return 1 ;
			} else if (a < b) {
				return -1 ;
			} else {
				return 0 ;
			}
		}
	},
	sortStrings: function(strA, strB) {
		var i=0, a, b, c, x=0, y=0, r = 0 ;
		for (i = 0 ; i+x < strA.length && i+y < strB.length ; i++) {
			a = strA.charAt(i+x) ;
			b = strB.charAt(i+y) ;
			if (parseFloat(a) == a) {
				x++ ;
				while (i+x < strA.length) {
					c = strA.charAt(i+x)
					if (
						c == "1" || c == "2" || c == "3" || c == "4" ||
						c == "5" || c == "6" || c == "7" || c == "8" ||
						c == "9" || c == "0" || c == "."
					) {
						a += c ;
						x++ ;
					} else {
						break ;
					}
				}
				x-- ;
			}
			if (parseFloat(b) == b) {
				y++ ;
				while (i+y < strB.length) {
					c = strB.charAt(i+y)
					if (
						c == "1" || c == "2" || c == "3" || c == "4" ||
						c == "5" || c == "6" || c == "7" || c == "8" ||
						c == "9" || c == "0" || c == "."
					) {
						b += c ;
						y++ ;
					} else {
						break ;
					}
				}
				y-- ;
			}
			r = $.sortSelect.sortChars(a, b) ;
			if (r < 0) {
				return -1 ;
			} else if (r > 0) {
				return 1 ;
			}
		}
		return strA.length - strB.length ;
	},
	sortOptgroups: function(optA, optB) {
		return $.sortSelect.sortStrings($(optA).attr('label'), $(optB).attr('label')) ;
	},
	sortOptionsKey: function(optA, optB) {
		return $.sortSelect.sortStrings($(optA).attr('value'), $(optB).attr('value')) ;
	},
	sortOptionsHtml: function(optA, optB) {
		return $.sortSelect.sortStrings($(optA).text(), $(optB).text()) ;
	}
} ;

$.fn.sortSelect = function(keySortArg) {
	if (!$(this).is("select")) {
		return this ;
	}
	var keySort = keySortArg || false ;
	var optgroups = $.makeArray($("optgroup", this)) ;
	var options = $.makeArray($("> option", this)) ;
	var sortingArray = new Array ;
	var i, j ;
	if (optgroups.length != 0) {
		var optionsInGroup ;
		optgroups.sort($.sortSelect.sortOptgroups) ;
		$(this).empty() ;
		for (i = 0 ; i < optgroups.length ; i++) {
			optionsInGroup = $.makeArray($("option", optgroups[i])) ;
			if (keySort) {
				optionsInGroup.sort($.sortSelect.sortOptionsKey) ;
			} else {
				optionsInGroup.sort($.sortSelect.sortOptionsHtml) ;
			}
			$(optgroups[i]).empty() ;
			for (j = 0 ; j < optionsInGroup.length ; j++) {
				$(optgroups[i]).append(optionsInGroup[j]) ;
			}
			$(this).append(optgroups[i]) ;
		}
	}
	if (keySort) {
		options.sort($.sortSelect.sortOptionsKey) ;
	} else {
		options.sort($.sortSelect.sortOptionsHtml) ;
	}
	$("> option", this).remove() ;
	for (i = options.length-1 ; i >= 0 ; i--) {
		$(this).prepend(options[i]) ;
	}
	return this ;
} ;
