
/*
jQuery utils - @VERSION
http://code.google.com/p/jquery-utils/

(c) Maxime Haineault <haineault@gmail.com> 
http://haineault.com

MIT License (http://www.opensource.org/licenses/mit-license.php

*/

(function($){
   $.extend($.expr[':'], {
      // case insensitive version of :contains
      icontains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").toLowerCase().indexOf(m[3].toLowerCase())>=0;}
  });

	$.extend({ 

      // Taken from ui.core.js. 
      // Why are you keeping this gem for yourself guys ? :|
      keyCode: {
          BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, CONTROL: 17, DELETE: 46, DOWN: 40,
          END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT:  45, LEFT: 37,
          NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, 
          NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, 
          PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38
      },

      // Redirect to a specified url
      redirect: function(url) {
          window.location.href = url;
          return url;
      },

      // Stop event shorthand
      stop: function(e, preventDefault, stopPropagation) {
          if (preventDefault)  { e.preventDefault(); }
          if (stopPropagation) { e.stopPropagation(); }
          return preventDefault && false || true;
      },

      // Returns the basename of a path
      basename: function(path) {
          var t = path.split('/');
          return t[t.length] === '' && s || t.slice(0, t.length).join('/');
      },

      // Returns the filename of a path
      filename: function(path) {
          return path.split('/').pop();
      }, 

      // Returns a formated file size
      filesizeformat: function(bytes, suffixes){
          var b = parseInt(bytes, 10);
          var s = suffixes || ['byte', 'bytes', 'KB', 'MB', 'GB'];
          if (isNaN(b) || b === 0) { return '0 ' + s[0]; }
          if (b == 1)              { return '1 ' + s[0]; }
          if (b < 1024)            { return  b.toFixed(2) + ' ' + s[1]; }
          if (b < 1048576)         { return (b / 1024).toFixed(2) + ' ' + s[2]; }
          if (b < 1073741824)      { return (b / 1048576).toFixed(2) + ' '+ s[3]; }
          else                     { return (b / 1073741824).toFixed(2) + ' '+ s[4]; }
      },

      fileExtension: function(s) {
          var tokens = s.split('.');
          return tokens[tokens.length-1] || false;
      },
      
      // Returns true if an object is a String
      isString: function(o) {
          return typeof(o) == 'string' && true || false;
      },
      
      // Returns true if an object is a RegExp
		isRegExp: function(o) {
			return o && o.constructor.toString().indexOf('RegExp()') != -1 || false;
		},
      
      // Returns true if an object is an array
      // Mark Miller - http://blog.360.yahoo.com/blog-TBPekxc1dLNy5DOloPfzVvFIVOWMB0li?p=916
		isArray: function(o) {
          if (!o) { return false; }
          return Object.prototype.toString.apply(o.constructor.prototype) === '[object Array]';
		},
      
      // Convert input to currency (two decimal fixed number)
		toCurrency: function(i) {
			i = parseFloat(i, 10).toFixed(2);
			return (i=='NaN') ? '0.00' : i;
		},

      /*-------------------------------------------------------------------- 
       * javascript method: "pxToEm"
       * by:
         Scott Jehl (scott@filamentgroup.com) 
         Maggie Wachs (maggie@filamentgroup.com)
         http://www.filamentgroup.com
       *
       * Copyright (c) 2008 Filament Group
       * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
       *
       * Description: pxToEm converts a pixel value to ems depending on inherited font size.  
       * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/
       * Demo: http://www.filamentgroup.com/examples/pxToEm/	 	
       *							
       * Options:  	 								
              scope: string or jQuery selector for font-size scoping
              reverse: Boolean, true reverses the conversion to em-px
       * Dependencies: jQuery library						  
       * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true});
       *
       * Version: 2.1, 18.12.2008
       * Changelog:
       *		08.02.2007 initial Version 1.0
       *		08.01.2008 - fixed font-size calculation for IE
       *		18.12.2008 - removed native object prototyping to stay in jQuery's spirit, jsLinted (Maxime Haineault <haineault@gmail.com>)
      --------------------------------------------------------------------*/

      pxToEm: function(i, settings){
          //set defaults
          settings = jQuery.extend({
              scope: 'body',
              reverse: false
          }, settings);
          
          var pxVal = (i === '') ? 0 : parseFloat(i);
          var scopeVal;
          var getWindowWidth = function(){
              var de = document.documentElement;
              return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
          };	
          
          /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size. 
              For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size. 	
              When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size) 
              to get an accurate em value. */
                      
          if (settings.scope == 'body' && $.browser.msie && (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) {
              var calcFontSize = function(){		
                  return (parseFloat($('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16;
              };
              scopeVal = calcFontSize();
          }
          else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); }
                  
          var result = (settings.reverse === true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em';
          return result;
      }
	});

	$.extend($.fn, { 
      // Select a text range in a textarea
      selectRange: function(start, end){
          // use only the first one since only one input can be focused
          if ($(this).get(0).createTextRange) {
              var range = $(this).get(0).createTextRange();
              range.collapse(true);
              range.moveEnd('character',   end);
              range.moveStart('character', start);
              range.select();
          }
          else if ($(this).get(0).setSelectionRange) {
              $(this).bind('focus', function(e){
                  e.preventDefault();
              }).get(0).setSelectionRange(start, end);
          }
          return $(this);
      },

      /*-------------------------------------------------------------------- 
       * JQuery Plugin: "EqualHeights"
       * by:	Scott Jehl, Todd Parker, Maggie Costello Wachs (http://www.filamentgroup.com)
       *
       * Copyright (c) 2008 Filament Group
       * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
       *
       * Description: Compares the heights or widths of the top-level children of a provided element 
              and sets their min-height to the tallest height (or width to widest width). Sets in em units 
              by default if pxToEm() method is available.
       * Dependencies: jQuery library, pxToEm method	(article: 
              http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/)							  
       * Usage Example: $(element).equalHeights();
              Optional: to set min-height in px, pass a true argument: $(element).equalHeights(true);
       * Version: 2.1, 18.12.2008
       *
       * Note: Changed pxToEm call to call $.pxToEm instead, jsLinted (Maxime Haineault <haineault@gmail.com>)
      --------------------------------------------------------------------*/

      equalHeights: function(px){
          $(this).each(function(){
              var currentTallest = 0;
              $(this).children().each(function(i){
                  if ($(this).height() > currentTallest) { currentTallest = $(this).height(); }
              });
              if (!px || !$.pxToEm) { currentTallest = $.pxToEm(currentTallest); } //use ems unless px is specified
              // for ie6, set height since min-height isn't supported
              if ($.browser.msie && $.browser.version == 6.0) { $(this).children().css({'height': currentTallest}); }
              $(this).children().css({'min-height': currentTallest}); 
          });
          return this;
      },

      // Copyright (c) 2009 James Padolsey
      // http://james.padolsey.com/javascript/jquery-delay-plugin/
      delay: function(time, callback){
          jQuery.fx.step.delay = function(){};
          return this.animate({delay:1}, time, callback);
      }        
	});
})(jQuery);

