/*
 * 共通プラグイン
 *
 */

// In case you don't have firebug...
if (!window.console || !console.firebug) {
	var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
	window.console = {};
	for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {};
}

(function($) {

    var name_space = 'common';

    var klass = {
        url_params : {},
        ajax_default_params: {},
        debug_log : false,
        DEFINE: {
        }
    };

    // SSLでアクセスされている場合は、URLをhttps://に切り替える
    klass.replace_ssl_url = function(url) {
        var protocol_ssl = (document.location.protocol == 'https:');
        if (protocol_ssl) {
            url = url.replace('http://', 'https://');
        }
        return url;
    };

    // 通貨文字列
    klass.price_str = function(price) {
        return price.replace(/(\d{1,3})(?=(\d{3})+(?!\d))/g, "$1,");
    };

    // 日付＞文字列変換（format=yyyy/MM/dd HH:mm:ss)
    klass.date_format = function(date, format) {
        var fmt = new DateFormat(format);
        return fmt.format(date);
    };

    // 文字列＞日付変換（format=yyyy/MM/dd HH:mm:ss)
    klass.date_parse = function(date_str, format) {
        var fmt = new DateFormat(format);
        return fmt.parse(date_str);
    };

    // 指定されたURLに遷移（IEの場合はリファラーが送られないのでDOMを生成して擬似クリック）
    klass.redirect = function(url) {
    	if ($.browser.msie) {
    		$('body').append('<a id="redirect_link" href="'+url+'" style="display:none">link</a>');
    		$('#redirect_link').get(0).click();
    	} else {
    		location.href = url;
    	}
    };

    // デバッグログ
    klass.debug = function(obj) {
        if (klass.debug_log) {
            console.log(obj);
        }
    };

    // URLパラメータの文字列を連想配列にする
    klass.get_parameter = function(str){
        var par = {};
        if (!str) {
            return par;
        }
        str = str.split('&');
        for(var i=0; i<str.length; i++){
            var itm = str[i].split("=");
            if (itm[0] != ''){
                if (itm[1]) {
                    par[itm[0]] = itm[1];
                } else {
                    par[itm[0]] = true;
                }
            }
        }
        return par;
    };

    // ページタイプのチェック
    klass.page_type_check = function(url) {
        // URLパラメータの解析
        var r = url.match(/\?(.*)$/i);
        if (r) {
            var url_param_str = r[1];
            klass.url_params = klass.get_parameter(url_param_str);
        }
    };

	// URIを解析したオブジェクトを返すfunction
	klass.Uri = function(path) {
		this.originalPath = path;
		//絶対パスを取得
		this.absolutePath = (function(){
			var e = document.createElement('span');
			e.innerHTML = '<a href="' + path + '" />';
			return e.firstChild.href;
		})();
		//絶対パスを分解
		var fields = {'schema' : 2, 'username' : 5, 'password' : 6, 'host' : 7, 'path' : 9, 'query' : 10, 'fragment' : 11};
		var r = /^((\w+):)?(\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/.exec(this.absolutePath);
		for (var field in fields) {
			this[field] = r[fields[field]]; 
		}
	};
	
	//現在のページと親ディレクトリへのリンク
	klass.selflink = function(options) {
		var c = $.extend({
			selfLinkClass:'current',
			parentsLinkClass:'parentsLink',
			postfix: '_cr'
		}, options);
		$('a[href]').each(function(){
			var href = new $.common.Uri(this.getAttribute('href'));
			var setImgFlg = false;
			if ((href.absolutePath == location.href) && !href.fragment) {
				//同じ文書にリンク
				$(this).addClass(c.selfLinkClass);
				setImgFlg = true;
			} else if (0 <= location.href.search(href.absolutePath)) {
				//親ディレクトリリンク
				$(this).addClass(c.parentsLinkClass);
				setImgFlg = true;
			}
			if (setImgFlg){
				//img要素が含まれていたら現在用画像（_cr）に設定
				$(this).find('img').each(function(){
					this.originalSrc = $(this).attr('src');
					this.currentSrc = this.originalSrc.replace(/(\.gif|\.jpg|\.png)/, c.postfix+"$1");
					$(this).attr('src',this.currentSrc);
				});
			}
		});
		$(c.reOrignalSrc).find('img').each(function(){
			$(this).attr('src',this.originalSrc);
		});
	};
	
	//ロールオーバー
	klass.rollover = function(options){
		var c = $.extend({
			hoverSelector: '.btn, .allbtn img',
			groupSelector: '.btngroup',
			postfix: '_on'
		}, options);
		//ロールオーバーするノードの初期化
		$(c.hoverSelector).filter(isNotCurrent).each(function(){
			this.originalSrc = $(this).attr('src');
			this.rolloverSrc = this.originalSrc.replace(/(\.gif|\.jpg|\.png)$/, c.postfix+"$1");
			this.rolloverImg = new Image;
			this.rolloverImg.src = this.rolloverSrc;
		});
		//グループ内のimg要素を指定するセレクタ生成
		var inGroup = new Array();
		$.each(c.groupSelector.split(/,\s?/g), function(i, n){
			inGroup.push(n + ' ' + c.hoverSelector.replace(/,\s?/g, ', '+ n +' '));
		});
		var inGroupSelector = $(inGroup.join(', '));
		//通常ロールオーバー
		$(c.hoverSelector).not(inGroupSelector).filter(isNotCurrent).hover(function(){
			$(this).attr('src',this.rolloverSrc);
		},function(){
			$(this).attr('src',this.originalSrc);
		});
		//グループ化されたロールオーバー
		$(c.groupSelector).hover(function(){
			$(this).find('img').filter(c.hoverSelector).filter(isNotCurrent).each(function(){
				$(this).attr('src',this.rolloverSrc);
			});
		},function(){
			$(this).find('img').filter(c.hoverSelector).filter(isNotCurrent).each(function(){
				$(this).attr('src',this.originalSrc);
			});
		});
		//フィルタ用function
		function isNotCurrent(i){
			return Boolean(!this.currentSrc);
		}
	};
	
	//ページ内リンクはするするスクロール
	klass.scroll = function(options) {
		//ドキュメントのスクロールを制御するオブジェクト
		var scroller = (function() {
			var c = $.extend({
				easing:250,
				step:30,
				fps:60
			}, options);
			c.ms = Math.floor(1000/c.fps);
			var timerId;
			var param = {
				stepCount:0,
				startY:0,
				endY:0,
				lastY:0
			};
			//スクロール中に実行されるfunction
			function move() {
				if (param.stepCount == c.step) {
					//スクロール終了時
					window.scrollTo(getCurrentX(), param.endY);
				} else if (param.lastY == getCurrentY()) {
					//通常スクロール時
					param.stepCount++;
					window.scrollTo(getCurrentX(), getEasingY());
					param.lastY = getEasingY();
					timerId = setTimeout(move, c.ms); 
				}
			}
			function getCurrentY() {
				return document.body.scrollTop  || document.documentElement.scrollTop;
			}
			function getCurrentX() {
				return document.body.scrollLeft  || document.documentElement.scrollLeft;
			}
			function getEasingY() {
				return Math.floor(getEasing(param.startY, param.endY, param.stepCount, c.step, c.easing));
			}
			function getEasing(start, end, stepCount, step, easing) {
				var s = stepCount / step;
				return (end - start) * (s + easing / (100 * Math.PI) * Math.sin(Math.PI * s)) + start;
			}
			return {
				set: function(options) {
					this.stop();
					if (options.startY == undefined) options.startY = getCurrentY();
					param = $.extend(param, options);
					param.lastY = param.startY;
					timerId = setTimeout(move, c.ms); 
				},
				stop: function(){
					clearTimeout(timerId);
					param.stepCount = 0;
				}
			};
		})();
		$('a[href^=#], area[href^=#]').not('a[href=#], area[href=#]').not('.noscroll').each(function(){
			this.hrefdata = new $.common.Uri(this.getAttribute('href'));
		}).click(function(){
			var target = $('#'+this.hrefdata.fragment);
			if (target.length) {
				scroller.set({
					endY: target.offset().top
				});
				return false;
			}
		});
	};
	
	//奇数、偶数を自動追加
	klass.stripe = function(options) {
		var c = $.extend({
			oddClass:'odd',
			evenClass:'even'
		}, options);
		$('ul, ol').each(function(){
			//JSでは0から数えるのでevenとaddを逆に指定
			$(this).children('li:odd').addClass(c.evenClass);
			$(this).children('li:even').addClass(c.oddClass);
		});
		$('table, tbody').each(function(){
			$(this).children('tr:odd').addClass(c.evenClass);
			$(this).children('tr:even').addClass(c.oddClass);
		});
	};
	
	//css3のクラスを追加
	klass.css3class = function() {
		//:first-child, :last-childをクラスとして追加
		$('body :first-child').addClass('firstChild');
		$('body :last-child').addClass('lastChild');
		//css3の:emptyをクラスとして追加
		//$('body :empty').addClass('empty');
	};
	
	//HTMLエスケープ
	klass.escapeHTML = function(str) {
		return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	};
	
	//画像プリロード
	klass.preload = function(arrayOfImages) {
		$(arrayOfImages).each(function(){
			$('<img/>')[0].src = this;
		});
	};

	// Ajaxの送信
	klass.ajax_send = function(url, params, callback, failback) {
		var sendParams = $.extend(klass.ajax_default_params, params);
		var post_data = {
			'params': $.toJSON(sendParams)
		};
		var settings = {
			METHOD: 'POST',
			url: webroot_path + url,
			data: post_data,
			CONTENT_TYPE: 'JSON',
			success: function(result) {
				if (result) {
					if (result.error) {
						if (result.errorcode) {
							alert(result.errormsg+'('+result.errorcode+')');
						} else {
							alert(result.errormsg);
						}
						if (failback) {
							failback(result);
						}
						return;
					}
					if (callback) {
						callback(result);
					}
				} else {
					alert('サーバーとの通信に失敗しました。サーバーが込み合っている可能性があります。はじめからやりなおしてください。');
					if (failback) {
						failback();
					}
				}
			}
		};
		var data = "";
		var now = new Date();
		var nowTime = now.getTime();
		settings.url += '?' + $.param({nocachex: nowTime});
		data = jQuery.param(settings.data);
		$.ajax({
			   type: settings.METHOD,
			   url: settings.url,
			   data: data,
			   dataType: settings.CONTENT_TYPE.toLowerCase(),
			   success: settings.success
		});
	};

    // 初期処理
    new function () {
        // URLパラメータの解析
        var r = location.href.match(/\?(.*)$/i);
        if (r) {
            var url_param_str = r[1];
            klass.url_params = klass.get_parameter(url_param_str);
        }
        if (klass.url_params['jsdebug']) {
            klass.debug_log = true;
        }
    };
    $[name_space] = klass;



/*
--------------------------------------------------------
dateformat.js - Simple date formatter
Version 1.1 (Update 2008/04/02)

Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com)

Released under an MIT-style license.

For details, see the web site:
 http://www.enjoyxstudy.com/javascript/dateformat/

--------------------------------------------------------
patterns
y : Year         ex. "yyyy" -> "2007", "yy" -> "07"
M : Month        ex. "MM" -> "05" "12", "M" -> "5" "12"
d : Day          ex. "dd" -> "09" "30", "d" -> "9" "30"
H : Hour (0-23)  ex. "HH" -> "00" "23", "H" -> "0" "23"
m : Minute       ex. "mm" -> "01" "59", "m" -> "1" "59"
s : Second       ex. "ss" -> "00" "59", "H" -> "0" "59"
S : Millisecond  ex. "SSS" -> "000" "012" "999",
                     "SS" -> "00" "12" "999", "S" -> "0" "12" "999"

Text can be quoted using single quotes (') to avoid interpretation.
"''" represents a single quote.


Useing..

 var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS");

 var str = fmt.format(new Date()); // "2007/05/10 12:21:19 002"
 var date = fmt.parse("2007/05/10 12:21:19 002"); // return Date object

--------------------------------------------------------
*/

var DateFormat = function(pattern) {
  this._init(pattern);
};

DateFormat.prototype = {
  _init: function(pattern) {

    this.pattern = pattern;
    this._patterns = [];

    for (var i = 0; i < pattern.length; i++) {
      var ch = pattern.charAt(i);
      if (this._patterns.length == 0) {
        this._patterns[0] = ch;
      } else {
        var index = this._patterns.length - 1;
        if (this._patterns[index].charAt(0) == "'") {
          if (this._patterns[index].length == 1
             || this._patterns[index].charAt(this._patterns[index].length - 1) != "'") {
            this._patterns[index] += ch;
          } else {
            this._patterns[index + 1] = ch;
          }
        } else if (this._patterns[index].charAt(0) == ch) {
          this._patterns[index] += ch;
        } else {
          this._patterns[index + 1] = ch;
        }
      }
    }
  },

  format: function(date) {

    var result = [];
    for (var i = 0; i < this._patterns.length; i++) {
      result[i] = this._formatWord(date, this._patterns[i]);
    }
    return result.join('');
  },
  _formatWord: function(date, pattern) {

    var formatter = this._formatter[pattern.charAt(0)];
    if (formatter) {
      return formatter.apply(this, [date, pattern]);
    } else {
      return pattern;
    }
  },
  _formatter: {
    "y": function(date, pattern) {
      // Year
      var year = String(date.getFullYear());
      if (pattern.length <= 2) {
        year = year.substring(2, 4);
      } else {
        year = this._zeroPadding(year, pattern.length);
      }
      return year;
    },
    "M": function(date, pattern) {
      // Month in year
      return this._zeroPadding(String(date.getMonth() + 1), pattern.length);
    },
    "d": function(date, pattern) {
      // Day in month
      return this._zeroPadding(String(date.getDate()), pattern.length);
    },
    "H": function(date, pattern) {
      // Hour in day (0-23)
      return this._zeroPadding(String(date.getHours()), pattern.length);
    },
    "m": function(date, pattern) {
      // Minute in hour
      return this._zeroPadding(String(date.getMinutes()), pattern.length);
    },
    "s": function(date, pattern) {
      // Second in minute
      return this._zeroPadding(String(date.getSeconds()), pattern.length);
    },
    "S": function(date, pattern) {
      // Millisecond
      return this._zeroPadding(String(date.getMilliseconds()), pattern.length);
    },
    "'": function(date, pattern) {
      // escape
      if (pattern == "''") {
        return "'";
      } else {
        return pattern.replace(/'/g, '');
      }
    }
  },

  _zeroPadding: function(str, length) {
    if (str.length >= length) {
      return str;
    }

    return new Array(length - str.length + 1).join("0") + str;
  },


  /// Parser ///
  parse: function(text) {

    if (typeof text != 'string' || text == '') return null;

    var result = {year: 1970, month: 1, day: 1, hour: 0, min: 0, sec: 0, msec: 0};

    for (var i = 0; i < this._patterns.length; i++) {
       if (text == '') return null; // parse error!!
       text = this._parseWord(text, this._patterns[i], result);
       if (text === null) return null; // parse error!!
    }
    if (text != '') return null; // parse error!!

    return new Date(
                result.year,
                result.month - 1,
                result.day,
                result.hour,
                result.min,
                result.sec,
                result.msec);
  },
  _parseWord: function(text, pattern, result) {

    var parser = this._parser[pattern.charAt(0)];
    if (parser) {
      return parser.apply(this, [text, pattern, result]);
    } else {
      if (text.indexOf(pattern) != 0) {
        return null;
      } else {
        return text.substring(pattern.length);
      }
    }
  },
  _parser: {
    "y": function(text, pattern, result) {
      // Year
      var year;
      if (pattern.length <= 2) {
        year = text.substring(0, 2);
        year = year < 70 ? '20' + year : '19' + year;
        text = text.substring(2);
      } else {
        var length = (pattern.length == 3) ? 4 : pattern.length;
        year = text.substring(0, length);
        text = text.substring(length);
      }
      if (!this._isNumber(year)) return null; // error
      result.year = parseInt(year, 10);
      return text;
    },
    "M": function(text, pattern, result) {
      // Month in year
      var month;
      if (pattern.length == 1 && text.length > 1
          && text.substring(0, 2).match(/1[0-2]/) != null) {
        month = text.substring(0, 2);
        text  = text.substring(2);
      } else {
        month = text.substring(0, pattern.length);
        text  = text.substring(pattern.length);
      }
      if (!this._isNumber(month)) return null; // error
      result.month = parseInt(month, 10);
      return text;
    },
    "d": function(text, pattern, result) {
      // Day in month
      var day;
      if (pattern.length == 1 && text.length > 1
          && text.substring(0, 2).match(/1[0-9]|2[0-9]|3[0-1]/) != null) {
        day  = text.substring(0, 2);
        text = text.substring(2);
      } else {
        day  = text.substring(0, pattern.length);
        text = text.substring(pattern.length);
      }
      if (!this._isNumber(day)) return null; // error
      result.day = parseInt(day, 10);
      return text;
    },
    "H": function(text, pattern, result) {
      // Hour in day (0-23)
      var hour;
      if (pattern.length == 1 && text.length > 1
          && text.substring(0, 2).match(/1[0-9]|2[0-3]/) != null) {
        hour = text.substring(0, 2);
        text = text.substring(2);
      } else {
        hour = text.substring(0, pattern.length);
        text = text.substring(pattern.length);
      }
      if (!this._isNumber(hour)) return null; // error
      result.hour = parseInt(hour, 10);
      return text;
    },
    "m": function(text, pattern, result) {
      // Minute in hour
      var min;
      if (pattern.length == 1 && text.length > 1
          && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
        min  = text.substring(0, 2);
        text = text.substring(2);
      } else {
        min  = text.substring(0, pattern.length);
        text = text.substring(pattern.length);
      }
      if (!this._isNumber(min)) return null; // error
      result.min = parseInt(min, 10);
      return text;
    },
    "s": function(text, pattern, result) {
      // Second in minute
      var sec;
      if (pattern.length == 1 && text.length > 1
          && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
        sec  = text.substring(0, 2);
        text = text.substring(2);
      } else {
        sec  = text.substring(0, pattern.length);
        text = text.substring(pattern.length);
      }
      if (!this._isNumber(sec)) return null; // error
      result.sec = parseInt(sec, 10);
      return text;
    },
    "S": function(text, pattern, result) {
      // Millimsecond
      var msec;
      if (pattern.length == 1 || pattern.length == 2) {
        if (text.length > 2 && text.substring(0, 3).match(/[1-9][0-9][0-9]/) != null) {
          msec = text.substring(0, 3);
          text = text.substring(3);
        } else if (text.length > 1 && text.substring(0, 2).match(/[1-9][0-9]/) != null) {
          msec = text.substring(0, 2);
          text = text.substring(2);
        } else {
          msec = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
      } else {
        msec = text.substring(0, pattern.length);
        text = text.substring(pattern.length);
      }
      if (!this._isNumber(msec)) return null; // error
      result.msec = parseInt(msec, 10);
      return text;
    },
    "'": function(text, pattern, result) {
      // escape
      if (pattern == "''") {
        pattern = "'";
      } else {
        pattern = pattern.replace(/'/g, '');
      }
      if (text.indexOf(pattern) != 0) {
        return null; // error
      } else {
        return text.substring(pattern.length);
      }
    }
  },

  _isNumber: function(str) {
    return /^[0-9]*$/.test(str);
  }
};


})(jQuery);



/* -------------------------------------------------- *
 * ToggleVal Plugin for jQuery                        *
 * Version 1.0                                        *
 * -------------------------------------------------- *
 * Author:   Aaron Kuzemchak                          *
 * URL:      http://kuzemchak.net/                    *
 * E-mail:   afkuzemchak@gmail.com                    *
 * Date:     8/18/2007                                *
 * -------------------------------------------------- */

jQuery.fn.toggleVal = function(focusClass) {
	this.each(function() {
		$(this).focus(function() {
			// clear value if current value is the default
			if($(this).val() == this.defaultValue) { $(this).val(""); }
			
			// if focusClass is set, add the class
			if(focusClass) { $(this).addClass(focusClass); }
		}).blur(function() {
			// restore to the default value if current value is empty
			if($(this).val() == "") { $(this).val(this.defaultValue); }
			
			// if focusClass is set, remove class
			if(focusClass) { $(this).removeClass(focusClass); }
		});
	});
};

jQuery.fn.toggleGetVal = function() {
	var el = $(this);
	var val = (el.val() == el.attr('defaultValue')) ? null : el.val();
	return val;
};

// Version 1.0 - October 19, 2007
// Requires http://jquery.com version 1.2.1
(function($){$.fn.biggerlink=function(a){var b={hoverclass:'hover',clickableclass:'hot',follow:true};if(a){$.extend(b,a)}$(this).filter(function(){return $('a',this).length>0}).addClass(b.clickableclass).each(function(i){$(this).attr('title',$('a[title]:first',this).attr('title'));$(this).mouseover(function(){window.status=$('a:first',this).attr('href');$(this).addClass(b.hoverclass)}).mouseout(function(){window.status='';$(this).removeClass(b.hoverclass)}).bind('click',function(){$(this).find('a:first').trigger('click')}).find('a').bind('focus',function(){$(this).parents('.'+b.clickableclass).addClass(b.hoverclass)}).bind('blur',function(){$(this).parents('.'+b.clickableclass).removeClass(b.hoverclass)}).end().find('a:first').bind('click',function(e){if(b.follow==true){window.location=this.href}e.stopPropagation()}).end().find('a',this).not(':first').bind('click',function(){$(this).parents('.'+b.clickableclass).find('a:first').trigger('click');return false})});return this}})(jQuery);

/*-------------------------------------------------------------------- 
 * 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.0, 08.01.2008
--------------------------------------------------------------------*/

jQuery.fn.equalHeights = function(px) {
	var currentTallest = 0;
	$(this).each(function(){
		if ($(this).height() > currentTallest) { currentTallest = $(this).height(); }
	});
	// for ie6, set height since min-height isn't supported
	$(this).each(function(){
		if ($.browser.msie && $.browser.version == 6.0) { $(this).css({'height': currentTallest}); }
		$(this).css({'min-height': currentTallest}); 
	});
	return this;
};


/*
 * Link Wrapper - jQuery plugin for long URL
 *  
 * Copyright (c) 2008 Norifumi SUNAOKA
 *
 * Dual licensed under 
 * the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.gnu.org/licenses/gpl.html) licenses.
 *
 * Version: 1.0.3
 */
jQuery.fn.linkwrapper = function(config) {
	config = jQuery.extend({
		pattern: '(.)'
	}, config);
	var pattern = new RegExp(config.pattern, 'g');
	var tag = jQuery.browser.opera ? '&#8203;' : '<wbr />';
	return this.each(function() {
		jQuery(this).html(jQuery(this).text().replace(pattern, '$1' + tag));
	});
};


/*
highlight v3
Highlights arbitrary terms.
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
MIT license.
Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>
*/

jQuery.fn.highlight = function(pat) {
 function innerHighlight(node, pat) {
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = 'highlight';
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 });
};

jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();
};

jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + options.path : '';
var domain = options.domain ? '; domain=' + options.domain : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};

// jquery.json
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);



