/*
* jQuery TinySort - A plugin to sort child nodes by (sub) contents or attributes.
*
* Version: 1.0.2
*
* Copyright (c) 2008 Ron Valstar
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* description
*   - A plugin to sort child nodes by (sub) contents or attributes.
*
* Usage:
*   jQuery("ul#people>li").tsort();
*   jQuery("ul#people>li").tsort("span.surname");
*   jQuery("ul#people>li").tsort("span.surname",{order:"desc"});
*   jQuery("ul#people>li").tsort({place:"end"});
*
* Change default like so:
*   jQuery.tinysort.defaults.order = "desc";
*
* Changes in 1.0.2
*   - matching numerics did not work for trailing zero's, replaced with regexp (which should now work for + and - signs as well)
*
* Todos
*   - fix mixed literal/numeral values
*   - determine if I have to use setArray or pushStack
*
*/
;(function(jQuery) {
	// default settings
	jQuery.tinysort = {
		 id: "TinySort"
		,version: "1.0.2"
		,defaults: {
			order: "asc"	// order: asc, desc or rand
			,attr: ""		// order by attribute value
			,place: "start"	// place ordered elements at position: start, end, org (original position), first
			,returns: false	// return all elements or only the sorted ones (true/false)
		}
	};
	jQuery.fn.extend({
		tinysort: function(_find,_settings) {
			if (_find&&typeof(_find)!="string") {
				_settings = _find;
				_find = null;
			}

			var oSettings = jQuery.extend({}, jQuery.tinysort.defaults, _settings);

			var oElements = {}; // contains sortable- and non-sortable list per parent
			this.each(function(i) {
				// element or sub selection
				var mElm = (!_find||_find=="")?jQuery(this):jQuery(this).find(_find);
				// text or attribute value
				var sSort = oSettings.order=="rand"?""+Math.random():(oSettings.attr==""?mElm.text():mElm.attr(oSettings.attr));
				// to sort or not to sort
				var mParent = jQuery(this).parent();
				if (!oElements[mParent]) oElements[mParent] = {s:[],n:[]};	// s: sort, n: not sort
				if (mElm.length>0)	oElements[mParent].s.push({s:sSort,e:jQuery(this),n:i}); // s:string, e:element, n:number
				else				oElements[mParent].n.push({e:jQuery(this),n:i});
			});
			//
			// sort
			for (var sParent in oElements) {
				var oParent = oElements[sParent];
				oParent.s.sort(
					function zeSort(a,b) {
						var x = a.s.toLowerCase?a.s.toLowerCase():a.s;
						var y = b.s.toLowerCase?b.s.toLowerCase():b.s;
						if (isNum(a.s)&&isNum(b.s)) {
							x = parseFloat(a.s);
							y = parseFloat(b.s);
						}
						return (oSettings.order=="asc"?1:-1)*(x<y?-1:(x>y?1:0));
					}
				);
			}
			//
			// order elements and fill new order
			var aNewOrder = [];
			for (var sParent in oElements) {
				var oParent = oElements[sParent];
				var aOrg = []; // list for original position
				var iLow = jQuery(this).length;
				switch (oSettings.place) {
					case "first": jQuery.each(oParent.s,function(i,obj) { iLow = Math.min(iLow,obj.n) }); break;
					case "org": jQuery.each(oParent.s,function(i,obj) { aOrg.push(obj.n) }); break;
					case "end": iLow = oParent.n.length; break;
					default: iLow = 0;
				}
				var aCnt = [0,0]; // count how much we've sorted for retreival from either the sort list or the non-sort list (oParent.s/oParent.n)
				for (var i=0;i<jQuery(this).length;i++) {
					var bSList = i>=iLow&&i<iLow+oParent.s.length;
					if (contains(aOrg,i)) bSList = true;
					var mEl = (bSList?oParent.s:oParent.n)[aCnt[bSList?0:1]].e;
					mEl.css('display', 'none');
					mEl.parent().append(mEl);
					mEl.show("slow");
					if (bSList||!oSettings.returns) aNewOrder.push(mEl.get(0));
					aCnt[bSList?0:1]++;
				}
			}
			//
			return this.setArray(aNewOrder); // setArray or pushStack?
		}
	});
	// is numeric
	function isNum(n) {
		return /^[\+-]?\d*\.?\d*$/.exec(n);
	};
	// array contains
	function contains(a,n) {
		var bInside = false;
		jQuery.each(a,function(i,m) {
			if (!bInside) bInside = m==n;
		});
		return bInside;
	};
	// set functions
	jQuery.fn.TinySort = jQuery.fn.Tinysort = jQuery.fn.tsort = jQuery.fn.tinysort;
})(jQuery);

function tiresShow() {
	jQuery("div#tireBrandsListShort").hide();
	jQuery("div#tireBrandsListLong").show();
	//jQuery("#tiresShow").text('Pokaż tylko najpopularniejsze marki opon');
	//jQuery("#tiresShow").unbind("click", tiresShow).click(function(){return false;}).bind("click", tiresHide);
	jQuery("#tiresShowText").html('<a href="#" style="font-weight: bold;" id="tiresShow" onclick="return tiresHide();" title="Kliknij, aby zmienić rozmiar listy...">Pokaż tylko najpopularniejsze marki opon</a>');

	return false;
}

function tiresHide() {
	jQuery("div#tireBrandsListLong").hide();
	jQuery("div#tireBrandsListShort").show();
	//jQuery("#tiresShow").text('Pokaż wszystkie marki opon');
	//jQuery("#tiresShow").unbind("click", tiresHide).click(function(){return false;}).click(tiresShow);
	//jQuery("#tiresShow").blur();
	jQuery("#tiresShowText").html('<a href="#" style="font-weight: bold;" id="tiresShow" onclick="return tiresShow();" title="Kliknij, aby zmienić rozmiar listy...">Pokaż wszystkie marki opon</a>');

	
	return false;
}