

jQuery.fn.checkboxToggle = function(opt){

   var check = jQuery(this).next()[0].checked == true;
   jQuery(this)
		   .attr({ src: check ? opt.unchecked : opt.checked })
		   .next()[0].checked = !check;
}

jQuery.fn.checkbox = function(opt){
	$(":checkbox", this)
		//hide
		.hide()
		//
		.each(function (){
			$("<img src='"+ ((this.checked) ? opt.checked : opt.unchecked) +"' alt='check' class='replace'/>").click(function() {$(this).checkboxToggle(opt);highlightBkg($(this).parent().attr('id'));}).insertBefore(this);
	});
}



/*======================================================================*\

	Enable Disabling
	http://groups.google.com/group/jquery-en/msg/308c67af4c2f0aad

\*======================================================================*/

jQuery.fn.extend({
	filterHasDisabled : function(){
		return this.filter(function(){
			return(typeof(this.disabled)!=undefined)})
		},
		disabled: function(h) {
			if (h!=undefined) 
				return this.filterHasDisabled().each(function(){this.disabled=h});
        	this.filterHasDisabled().each(function() {h=((h||this.disabled)&&this.disabled)}); 
			return h;
		},
		toggleDisabled: function() { 
			return this.filterHasDisabled().each(function(){this.disabled=!this.disabled});
		}
}); 

/*======================================================================*\

	a tiny jQuery extension that logs the current jQuery selection 
	to the firebug console.
	http://happygiraffe.net/blog/articles/2007/09/26/jquery-logging

\*======================================================================*/

jQuery.fn.log = function (msg) {
	console.log("%s: %o", msg, this);
	return this;
};



/*======================================================================*\
 	jQuery Color Animations
 	Copyright 2007 John Resig
 	Released under the MIT and GPL licenses.
\*======================================================================*/

(function(jQuery){

	// We override the animation for all of these color styles
	jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
		jQuery.fx.step[attr] = function(fx){
			if ( fx.state == 0 ) {
				fx.start = getColor( fx.elem, attr );
				fx.end = getRGB( fx.end );
			}

			fx.elem.style[attr] = "rgb(" + [
				Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
				Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
				Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
			].join(",") + ")";
		}
	});

	// Color Conversion functions from highlightFade
	// By Blair Mitchelmore
	// http://jquery.offput.ca/highlightFade/

	// Parse strings looking for color tuples [255,255,255]
	function getRGB(color) {
		var result;

		// Check if we're already dealing with an array of colors
		if ( color && color.constructor == Array && color.length == 3 )
			return color;

		// Look for rgb(num,num,num)
		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
			return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];

		// Look for rgb(num%,num%,num%)
		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
			return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

		// Look for #a0b1c2
		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
			return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

		// Look for #fff
		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
			return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

		// Otherwise, we're most likely dealing with a named color
		return colors[jQuery.trim(color).toLowerCase()];
	}
	
	function getColor(elem, attr) {
		var color;

		do {
			color = jQuery.curCSS(elem, attr);

			// Keep going until we find an element that has color, or we hit the body
			if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
				break; 

			attr = "backgroundColor";
		} while ( elem = elem.parentNode );

		return getRGB(color);
	};
	
	// Some named colors to work with
	// From Interface by Stefan Petre
	// http://interface.eyecon.ro/

	var colors = {
		aqua:[0,255,255],
		azure:[240,255,255],
		beige:[245,245,220],
		black:[0,0,0],
		blue:[0,0,255],
		brown:[165,42,42],
		cyan:[0,255,255],
		darkblue:[0,0,139],
		darkcyan:[0,139,139],
		darkgrey:[169,169,169],
		darkgreen:[0,100,0],
		darkkhaki:[189,183,107],
		darkmagenta:[139,0,139],
		darkolivegreen:[85,107,47],
		darkorange:[255,140,0],
		darkorchid:[153,50,204],
		darkred:[139,0,0],
		darksalmon:[233,150,122],
		darkviolet:[148,0,211],
		fuchsia:[255,0,255],
		gold:[255,215,0],
		green:[0,128,0],
		indigo:[75,0,130],
		khaki:[240,230,140],
		lightblue:[173,216,230],
		lightcyan:[224,255,255],
		lightgreen:[144,238,144],
		lightgrey:[211,211,211],
		lightpink:[255,182,193],
		lightyellow:[255,255,224],
		lime:[0,255,0],
		magenta:[255,0,255],
		maroon:[128,0,0],
		navy:[0,0,128],
		olive:[128,128,0],
		orange:[255,165,0],
		pink:[255,192,203],
		purple:[128,0,128],
		violet:[128,0,128],
		red:[255,0,0],
		silver:[192,192,192],
		white:[255,255,255],
		yellow:[255,255,0]
	};
	
})(jQuery);

/*======================================================================*\

	Author: Realazy
	http://realazy.org/blog/ (chinese)

\*======================================================================*/


jQuery.arrRemove = function(arr, rm){
    for (var i = 0, n = 0; i < arr.length; ++i){
        if (arr[i] != rm)
            arr[n++] = arr[i];
    }
    arr.length--;
}

/*======================================================================*\

	usage: jQuery(from).tagTo(target, seperator)
	from contain the tags(use a links), target must be assigned and its type must be input type="text" or textarea
	seperator can be "-", "," and space etc, if not assign, the default seperator is ","
	tclass is the class name of the tag which is currently selected, if not assign, the default class name is "selected"

\*======================================================================*/

jQuery.fn.extend({
	tagTo : function(target, seperator, tclass){
		if ("string" == typeof target) target = jQuery(target);
			seperator = arguments[1] || ",";
			tclass = arguments[2] || "selected";

			var tagname = target.get(0).nodeName.toLowerCase();
			if (tagname == "input" || tagname == "textarea"){
				jQuery('a', this).click(function(){
					if (jQuery.trim(target.val()) == ''){
						target.val(jQuery(this).text());
						jQuery(this).addClass(tclass);
					} else {
						var arr = target.val().split(seperator);    
						var isInArr = false;
						var position;
						for (var i = 0, n = arr.length; i < n; ++i) {
							if (jQuery.trim(arr[i]) == jQuery(this).text()){
								isInArr = true;
								position = i;
								break;
							}
						}
						if (isInArr == true){
							jQuery.arrRemove(arr, arr[position]);
							jQuery(this).removeClass(tclass);
						} else {
							arr.push(jQuery(this).text());
							jQuery(this).addClass(tclass);
						}
						target.val(arr.join(seperator));
					}
					return false;
				}); 
    	} 
		else {
      	  throw "target must be an text area";
   	 	}
	}
}); 

/*======================================================================*\

	hacked original json.js into a jQuery plugin.
	It adds the two functions:
	$.toJSON(value)
	$.parseJSON(json_str, [safe]).
	http://jollytoad.googlepages.com/json.js

\*======================================================================*/

(function ($) {
    var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        s = {
            'array': function (x) {
                var a = ['['], b, f, i, l = x.length, v;
                for (i = 0; i < l; i += 1) {
                    v = x[i];
                    f = s[typeof v];
                    if (f) {
                        v = f(v);
                        if (typeof v == 'string') {
                            if (b) {
                                a[a.length] = ',';
                            }
                            a[a.length] = v;
                            b = true;
                        }
                    }
                }
                a[a.length] = ']';
                return a.join('');
            },
            'boolean': function (x) {
                return String(x);
            },
            'null': function (x) {
                return "null";
            },
            'number': function (x) {
                return isFinite(x) ? String(x) : 'null';
            },
            'object': function (x) {
                if (x) {
                    if (x instanceof Array) {
                        return s.array(x);
                    }
                    var a = ['{'], b, f, i, v;
                    for (i in x) {
                        v = x[i];
                        f = s[typeof v];
                        if (f) {
                            v = f(v);
                            if (typeof v == 'string') {
                                if (b) {
                                    a[a.length] = ',';
                                }
                                a.push(s.string(i), ':', v);
                                b = true;
                            }
                        }
                    }
                    a[a.length] = '}';
                    return a.join('');
                }
                return 'null';
            },
            'string': function (x) {
                if (/["\\\x00-\x1f]/.test(x)) {
                    x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                        var c = m[b];
                        if (c) {
                            return c;
                        }
                        c = b.charCodeAt();
                        return '\\u00' +
                            Math.floor(c / 16).toString(16) +
                            (c % 16).toString(16);
                    });
                }
                return '"' + x + '"';
            }
        };

	$.toJSON = function(v) {
		var f = isNaN(v) ? s[typeof v] : s['number'];
		if (f) return f(v);
	};
	
	$.parseJSON = function(v, safe) {
		if (safe === undefined) safe = $.parseJSON.safe;
		if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v))
			return undefined;
		return eval('('+v+')');
	};
	
	$.parseJSON.safe = false;

})(jQuery);



