﻿/*
* jQuery Sort plugin
* Version 1.1.0 (4/1/09)
* @requires jQuery v1.2.3 or later
*
* Copyright (c) 2009 C. Pettit / ZeroPoint Development
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*  
*/



(function($) {

    $.fn.sort = function(sortAttr, sortDesc) {
	//Must Specify Sort Attribute
        if (typeof (sortAttr) === "undefined") {
            return $(this);
        }
        if (sortAttr == "") {
            return $(this);
        }

	//If sort attribute is a single string such as "name"
        if (typeof (sortAttr) === "string") {

            var retObj = $(this).get().sort(function(a, b) {
		//Sort numeric values
                if (typeof ($(a).attr(sortAttr)) === "number") {

                    return parseInt($(a).attr(sortAttr)) > parseInt($(b).attr(sortAttr)) ? 1 : -1;
                }
		//sort string values
                else {
					var aa = $(a).attr(sortAttr).replace(/[^0-9]/g, '');
					var bb = $(b).attr(sortAttr).replace(/[^0-9]/g, '');
					var aaa = pad(aa,3);
					var bbb = pad(bb,3);
					return aaa > bbb	? 1 : -1;
                    //return $(a).attr(sortAttr).replace(/[^0-9]/g, '') > $(b).attr(sortAttr).replace(/[^0-9]/g, '')	? 1 : -1;
                }
            });
	    //If sort is descending
            if (getSort(sortDesc)) {
                return $(retObj.reverse());
            }
            else {
                return $(retObj);
            }
        }
	//If data is an object such as a returned JSON object
        if (typeof (sortAttr) === "object") {
	    //If the sort attribute is an Array  i.e. ["Name", "Phone","Foo"] , this will sort based on that order.
            if ((sortAttr).length) {
                var retObj = $(this).get().sort(function(a, b) {
                    var i = 0;
                    var retval = 1;
                    while (i < sortAttr.length) {
                        var al = $(a).attr(sortAttr[i]).toLowerCase();
                        var bl = $(b).attr(sortAttr[i]).toLowerCase();

                        if (al > bl) { retval = 1; break; }
                        if (bl > al) { retval = -1; break; }
                        i++;
                    }
                    return retval;

                });
                if (getSort(sortDesc)) {
                    return $(retObj.reverse());
                }
                else {
                    return $(retObj);
                }
            }
 	    //Sort object based on single sort attribute
            else {
                var retObj = $(this).get().sort(function(a, b) {
                    var attrLen = 0;
                    for (var v in sortAttr) {
                        var al = $(a).attr(v).toLowerCase();
                        var bl = $(b).attr(v).toLowerCase();
                        if (al > bl) { return (getSort(sortAttr[v])) ? -1 : 1; }
                        if (bl > al) { return (getSort(sortAttr[v])) ? 1 : -1; }
                    }

                });
                if (getSort(sortDesc)) {
                    return $(retObj.reverse());
                }
                else {
                    return $(retObj);
                }

            }
        }
    }

	//Determines if the sort should be Ascending(false) or Descending(true)
	//Can determine based on Boolean Value or String
    function getSort(sortDesc) {
        if (typeof sortDesc == "boolean") {
            return sortDesc;
        }
        else if (sortDesc.toLowerCase() == "desc") {
            return true;
        }
	//Incase boolean value gets passed as string
        else if (sortDesc.toLowerCase() == "true") {
            return true;
        }
        else return false;
    }
	
	function strpad(val){
		return (!isNaN(val) && val.toString().length==1)?"0"+val:val;
	}
	
	function pad(n, len) {
	   
		s = n.toString();
		if (s.length < len) {
			s = ('0000000000' + s).slice(-len);
		}

		return s;
	   
	}

})(jQuery);

