/* base */
String.prototype.Length = function(){var orString = new String(this);  var len = 0; if (orString=="") {return len;}for(var vii=0;vii<orString.length;vii++){len++; } return len;}
if (!Function.prototype.apply){
	Function.prototype.apply = function(object, parameters){
		var parameterStrings = [];
		if (!object)	object = window;
		if (!parameters)	parameters = [];
		for (var i=0; i<parameters.length; i++)
			parameterStrings[i] = "parameters[" + i + "]";
		object.__apply__ = this;
		var result = eval("object.__apply__(" + parameterStrings.join(", ") + ")");
		object.__apply__ = null;

		return result;
	}
}
var Class = {
	create: function(){
		return function(){
			this.initialize.apply(this, arguments);
		}
	}
}

var Delegate = {
	create: function (obj, func){
		var f = function()	{
			var target = arguments.callee.target;
			var func = arguments.callee.func;
			return func.apply(target, arguments);
		}
		f.target = obj;
		f.func = func;
		return f;
	}
};

var isFunction = function(a){ return typeof a == "function"; };
var isEmpty     = function(a){ return a == ""; };
var isNull     = function(a){ return typeof a == "object" && !a; };
var isNumber   = function(a){ return typeof a == "number" && isFinite(a);};
var isObject   = function(a){ return (a && typeof a == "object") || isFunction(a);};
var isString   = function(a){ return typeof a == "string";};
var isArray    = function(a){ return isObject(a) && a.constructor == Array; };
var isUndef    = function(a){ return typeof a == "undefined";};
var DoUnchanged= function(a){ return a;}
var DoNothing  = function(){};

jQuery.extend({
	isNull     : function(a){ return typeof a == "object" && !a; },
	isNumber   : function(a){ return typeof a == "number" && isFinite(a);},

	isFunction : function(a){ return typeof(a) == "function"; },
	isObject   : function(a){ return (a && typeof a == "object") || isFunction(a);},
	isString   : function(a){ return typeof a == "string";},
	isUndef    : function(a){ return typeof a == "undefined";},
	getEvtTarget: function(evt){return jQuery(jQuery.browser.msie ? evt.srcElement : evt.target);}
});


jQuery.fn.extend({
	getParentByType: function(type)
	{
		var ret = [];
		for (var i=0; i < this.length; ++i)
		{
			var pTarget = this[i];
			while(pTarget!=null && pTarget.tagName != type)
			{
				pTarget = pTarget.parentNode;
			}
			if (pTarget != null)
				ret.push(pTarget);
		}
		return jQuery(ret);
	}
});


var DoNothing  = function(){};

var $P = function(parameter, url){
	url = url || window.location.href;
	return URL.getParameter(parameter, url);
};

/* array */
var $A = function(iterable){
	if (!iterable)
		return [];
	if (iterable.toArray)
    	return iterable.toArray();
	if ($.isString(iterable) || $.isUndef(iterable.length))
		return [iterable];

	var results = [];
	for (var i=0; i<iterable.length; i++)
		results.push(iterable[i]);
	return results;
}

if (!Array.prototype.push){
	Array.prototype.push = function(){
		var len = this.length;
		for (var i=0; i<arguments.length; i++) {
			this[len + i] = arguments[i];
		}
		return this.length;
	}
}

if (!Array.prototype.pop){
	Array.prototype.pop = function(){
		var returnValue = this[this.length - 1];
		this.length--;
		return returnValue;
	}
}

if (!Array.prototype.splice){
	Array.prototype.splice = function(start, deleteCount){
		var len = arguments.length - 2;
		var returnValue = this.slice(start);
		for (var i = 0; i < len; i++) {
			this[start + i] = arguments[i + 2];
		}
		for (var i = 0; i < returnValue.length - deleteCount; i++) {
			this[start + len + i] = returnValue[deleteCount + i];
		}
		this.length = start + len + returnValue.length - deleteCount;
		returnValue.length = deleteCount;
		return returnValue;
	}
}

jQuery.extend(Array.prototype, {
	indexOf: function(element)
	{
		for (var i=0; i < this.length; ++i)
		{
			if (this[i] == element)
				return i;
		}
		return -1;
	},

	select: function(iterator){
		var results = [];
		for(var i=0; i < this.length; ++i){
			if (iterator(this[i], i))
				results.push(this[i]);
    	};
    	return results;
	},

	contain: function(element){
		return this.indexOf(element) != -1;
	},

	clear: function(){
		this.length = 0;
	},

	insert: function(position){
		for (var i=arguments.length-1; i>0; i--)
			this.splice(position, 0, arguments[i]);
	},

	remove: function(position, count){
		count = $.isUndef(count) ? 1 : count;
		this.splice(position, count);
	},

	exclude: function(element){
		var position = this.indexOf(element);
		if (position == -1)
			return;
		this.remove(position);
	},

	empty: function(){
		return this.length == 0;
	},

	first: function(){
		return this[0];
	},

	last: function(){
		return this[this.length - 1];
	},

	clone: function(){
		return this.slice(0);
	},

	shuffle: function(){
		var result = [];
		var source = this.clone();
		var index;
		this.each(function(){
			index = Math.floor(Math.random()*source.length);
			result.push(source[index]);
			source.remove(index);
		});
		return result;
	}
});

/* string */
jQuery.extend(String.prototype, {
	trim: function(){
		return this.replace(/(^\s+)|(\s+$)/g, "");
	},

	bytes: function(){
		return this.replace(/[^\x00-\xff]/g, "  ").length;
	},

	truncate: function(bytes, tail){
		tail = tail || "";
		var result;
		for (var i=0; i<this.length; i++){
			if ((result=this.substr(0, i)).bytes() >= bytes)
				return result + tail;
		}
		return this.substr(0);
	},

	count: function(string, caseSensitive){
		var result = this.match(new RegExp(string, "g"+(caseSensitive?"":"i")));
		return isNull(result) ? 0 : result.length;
	},

	strip: function(){
		var temp = this;
		temp = temp.replace(/&/ig, "&amp;");
		temp = temp.replace(/</ig, "&lt;");
		temp = temp.replace(/>/ig, "&gt;");
		temp = temp.replace(/\"/ig, "&quot;");
		temp = temp.replace(/\'/ig, "&#39;");
		temp = temp.replace(/ /ig, "&nbsp;");
		temp = temp.replace(/(\r?\n)|\r/ig, "<br />");
		return temp;
	},

	revert: function(){
		var temp = this;
		temp = temp.replace(/&apos;/ig, "\'");
		temp = temp.replace(/&quot;/ig, "\"");
		temp = temp.replace(/&gt;/ig, ">");
		temp = temp.replace(/&lt;/ig, "<");
		temp = temp.replace(/&nbsp;/ig, " ");
		temp = temp.replace(/&amp;/ig, "&");
		temp = temp.replace(/<br.*?>|<\/p><p(\s*|\s+.+?)>/ig, "\n").replace(/<\/?p(\s*|\s+.+?)>/ig,"");
		return temp;
	},

	camelize: function(){
		var result = this.replace(new RegExp("(\\W)+", "g"), "");
		return result.charAt(0).toLowerCase() + result.substr(1);
	},

	toFileSize: function(){
		if (/^\d+(?:\.\d+)?(K|M|G|T)B$/ig.test(this))
			return this;
		if (!this.match(/^(\d+)B?$/ig))
			return "0B";
		var suffixes = ["B", "KB", "MB", "GB", "TB"];
		var size = parseInt(RegExp.$1);
		var k = 1024;
		var h = 100;
		var s = size * h;
		while (s >= k*h){
			s = parseInt(s/k);
			suffixes.shift();
		}
		return s/100 + suffixes[0];
	}
});/* url */
var URL = {
	getParameter: function(parameter, url){
		return $.isNull(url.match(new RegExp("[?#&]"+parameter+"=(.*?)(?:[#&]|$)", "i"))) ? "" : RegExp.$1;
	},

	getSuffix: function(url){
		var dot = url.lastIndexOf(".");
		return dot==-1 ? "" : url.substr(dot+1);
	},

	getProtocol: function(url){
		return $.isNull(url.match(/^(\w+):\/\//)) ? "" : RegExp.$1;
	},

	getHost: function(url){
		return $.isNull(url.match(/:\/\/([a-zA-Z0-9.]+)/)) ? "" : RegExp.$1;
	},

	isValid: function(url){
		//if (!$.isNull())
		return true;
	},

	isLocal: function(url){
		return !$.isNull(url.match(/(^file|^[A-Za-z]):/i));
	}
}
/* cookie */
var Cookie = {
	set: function(label, value, expireTime,subdomain){
		if(isNull(subdomain)||isUndef(subdomain))
			subdomain='';
		var cookie = label + "=" + escape(value) +"; domain="+subdomain+"gougou.com; path=/;";
		if ($.isUndef(expireTime))
			document.cookie = cookie;
		else{
			var expires = new Date();
			expires.setTime(expires.getTime() + expireTime*1000);
			document.cookie = label + "=" + escape(value) +"; domain=gougou.com; path=/; expires=" + expires.toGMTString() + ";";
		}
	},

	get: function(label){
		return $.isNull(document.cookie.match(new RegExp("(^"+label+"| "+label+")=([^;]*)"))) ? "" : unescape(RegExp.$2);
	},

	get2: function(label){
		return $.isNull(document.cookie.match(new RegExp("(^"+label+"| "+label+")=([^;]*)"))) ? "" : RegExp.$2;
	},

	clear: function(label){
		Cookie.set(label, "");
	},

	getAll: function(){
		return document.cookie;
	}
};/* bridge */


jQuery.extend({
	getBb: function(optionsInput)
	{
		var opt = {
			bridge: "/web/bridge.htm"
		};

		var url = optionsInput["url"];
		optionsInput = jQuery.extend(opt, optionsInput);
		checkBridge("bridge_" + URL.getHost(url).replace(/\./g, "_"), optionsInput);

		function checkBridge(_bridge, options)
		{
			var _transport = jQuery('#'+_bridge);
			if (_transport.length == 0) {
				initBridge(_bridge, options);
			} else {
				if (_transport.attr("loaded")) {
					makeRequest(_transport, options);
				} else {
					var interval = setInterval(function() {
						if (_transport.attr("loaded")) {
							clearInterval(interval);
							makeRequest(_transport, options);
						}
					}, 50);
				}
			}
		};

		function initBridge(_bridge, options) {
			var iframe = document.createElement("iframe");
			iframe.id = _bridge;
			iframe.width = iframe.height = 0;
			iframe.style.visibility = "hidden";
			_transport = jQuery(iframe);

			//alert(_transport);
			_transport.data("options", options);
			_transport.bind(jQuery.browser.msie ? "readystatechange":"load", onBridgeLoaded);
			var urlPort = (typeof options['port'] == 'undefined')?'80':options['port'];
            iframe.src = "http://" + URL.getHost(options["url"])+':'+urlPort+ options["bridge"];
			document.body.appendChild(iframe);
		};

		function onBridgeLoaded(evt)
		{
			var frame = jQuery.browser.msie ? evt.srcElement : evt.target;
			var _transport = jQuery(frame);
			if (jQuery.browser.msie && _transport.get()[0].readyState != "complete")
				return;
			//_transport[isMSIE() ? "onreadystatechange" : "onload"] = null;
			_transport.attr("loaded", "loaded");

			//alert(_transport.data("options"));
			makeRequest(_transport, _transport.data("options"));
			_transport.data("options", null);
		};

		function makeRequest(_transport, options){
			var _content = _transport.get()[0].contentWindow;
			try{
				_content.makeRequest(options);
			}catch(e){}
		};
	}
});


/* repeater */
/* repeater.js */
var Repeater = Class.create();
Repeater.getInstance = function(target, options){
	if ($.isUndef(this._targets))
		this._targets = {};
	if ($.isUndef(this._targets[target]))
		this._targets[target] = new Repeater(target, options);
	this._targets[target].resetOption(options);
	return this._targets[target];
};
Repeater.prototype = {
	initialize: function(target, options){
		this._options = this.setOptions(options);
		this._target = $("#"+target);
		this._data = null;
		this._template = "";
		this.currentIndex = 0;
		this.offset = 0;
		//Events.initialize(this);
		this.load();
		//this.addEventListener("onRepeat", this._options.onRepeat);
		//this.addEventListener("onRepeat2", this._options.onRepeat2);
	},

	resetOption: function(options){
		this._options=this.setOptions(options);
	},

	load: function(){
		if (this._template)
			return true;

		//alert(this._target+"\t"+$(this._target).length);
		if (this._target.length == 0)
			return false;
		this._template = this._target.html();
		//alert(this._template);
		this._target.empty();
		return true;
	},

	setOptions: function(options){
		var opt = {
			parent: null,
			onRepeat: DoNothing,
			onRepeat2: DoNothing
		};
		return $.extend(opt, options || {});
	},

	run: function(data, start, end, position)
	{
		if (!this._template)	return false;
		if (data)
			this._data = $A(data);
		if(!this._data)
			return false;

		this._target.empty();

		start = ($.isUndef(start) || start < 0) ? 0 : start;
		end = ($.isUndef(end) || end > this._data.length) ? this._data.length : end;
		this.offset = start;
		for (var i=start; i<end && i<this._data.length; i++){
			this.currentIndex = i-start;
			this.add(this._data[i], position);
		}
	},

	add: function(data, position){
		var html = this._template;
		//this.dispatchEvent({type:"onRepeat", dataProvider:data});

		this._options["onRepeat"](data, this);
		if(data.returnValue === false)
			return;
		//alert(data);
		html = Binder.inject(data, html);

		var newElem = $(html);
		this._options["onRepeat2"](newElem, data, this);
		//for (var param in data){
			//html = html.replace(new RegExp("<!--%"+param+"%-->", "gi"), data[param]);
		//}
		//html = html.replace(/<!--%(\w*)%-->/gi, "");
		//////Insertion[position || "bottom"](this._target, html);
		this._target.append(newElem);
		//this.dispatchEvent({type:"onRepeat2", dataProvider:data});
	}
};

var Binder = {
	/*run: function(data){
		if (arguments.length < 2)	return;
		$A(arguments).slice(1).each(function(target){
			$(target).innerHTML = Binder.inject(data, $(target).innerHTML);
		});
	},*/
	inject: function(data, htmlText){
		var dataUsed = {};
		var htmlTextCpy = htmlText;
		var reg = /(?:<|&lt;|%3C)(?:!|%21)--%(.+?)%--(?:>|&gt;|%3E)/i;
		while (!$.isNull(htmlTextCpy.match(reg))){
			var attrName = RegExp.$1;
			//alert(RegExp.rightContext+"\n"+RegExp.leftContext);
			dataUsed[attrName] = $.isUndef(data[attrName])?"":data[attrName];
			htmlTextCpy = RegExp.rightContext;
		}

		for (var param in dataUsed)
			htmlText = htmlText.replace(new RegExp("(<|&lt;|%3C)(!|%21)--%"+param+"%--(>|&gt;|%3E)", "gi"), dataUsed[param]);
		//return htmlText.replace(/(<|&lt;|%3C)(!|%21)--%(\w*)%--(>|&gt;|%3E)/gi, "");
		return htmlText;
	}
}
/* flipper */
var Flipper = Class.create();
Flipper.getInstance = function(divID, options){
	if ($.isUndef(this._flippers))
		this._flippers = {};

	if (!$.isUndef(options) && "redraw" in options && options.redraw == true)
		this._flippers[divID] = new Flipper(divID, options);
	else if ($.isUndef(this._flippers[divID]))
		this._flippers[divID] = new Flipper(divID, options);

	return this._flippers[divID];
};
Flipper.prototype = {
	initialize: function(flipperID, options){
		this._flipper = $("#"+flipperID);
		this._options = this.setOptions(options);
		this.pageSize = this._options.pageSize;
		this.totalRecord = this._options.totalRecord;
		this.totalPage = Math.floor((this.totalRecord - 1)/this.pageSize) + 1;
		this.currentPage = 0;
		this.drawFlipper(this._options.page || 1);
	},

	setOptions: function(options){
		var opt = {pageSize: 10, totalRecord:0};
		return jQuery.extend(opt, options || {});
	},

	drawFlipper: function(page){
		if (this.totalPage == 0) return;
		if (page < 1) page = 1;
		if (page > this.totalPage) page = this.totalPage;
		this.currentPage = page;
		var html = "";
		var tpl = '<a href="javascript:Flipper.getInstance(\'' + (this._flipper).get(0).id
									+ '\').flip({page})">{label}</a>&nbsp;';
		var regPage = /{page}/i;
		var regLabel = /{label}/i;
		html += (page == 1 ? "首页&nbsp;" : tpl.replace(regPage, ""+1).replace(regLabel, "首页"));
		if (page > 1){
			html += tpl.replace(regPage, ""+(page-1)).replace(regLabel, "上一页");
			for (var i=Math.max(1, page-5); i<page; i++){
				html += tpl.replace(regPage, ""+i).replace(regLabel, "["+i+"]");
			}
		}
		html += "<strong>[" + page + "]</strong>&nbsp;";
		if (page < this.totalPage){
			for (var i=page+1; i<Math.min(this.totalPage+1, page+5); i++){
				html += tpl.replace(regPage, ""+i).replace(regLabel, "["+i+"]");
			}
			html += tpl.replace(regPage, ""+(page+1)).replace(regLabel, "下一页");
		}
		html += (page == this.totalPage ? "尾页" : tpl.replace(regPage, ""+this.totalPage).replace(regLabel, "尾页"));
		this._flipper.html(html);
	},

	flip: function(page){
		if (this.totalPage == 0) return;
		if (page < 1) page = 1;
		if (page > this.totalPage) page = this.totalPage;
		this.currentPage = page;
		this._options["onFlip"](page);
		this.drawFlipper(page);
	}
};/* flash */
var Flash = Class.create();
Flash.prototype = {
	initialize: function(src, options){

		this._attributes = [];
		this._variables = {};
		this._parameters = {};
		this.installedVersion = Flash.getPlayerVersion();
		if (src) this.setAttribute("src", src);
		if (options.id) this.setAttribute("id", options.id);
		if (options.width) this.setAttribute("width", options.width);
		if (options.height) this.setAttribute("height", options.height);
		this.setAttribute("version", options.version || "8.0.22");
		this.addParameter("quality", options.quality || "high");
		this.addParameter("allowScriptAccess", options.allowScriptAccess || "always");

		if (!Flash.created){
			Flash.created = true;
			//prevent memory leaks in ie!
		//	Events.addListener(window, "unload", Flash.clear);
			$(window).bind("unload", Flash.clear);
		}

	},

	setAttribute: function(name, value){
		this._attributes[name] = value;
	},

	getAttribute: function(name){
		return this._attributes[name];
	},

	addParameter: function(name, value){
		this._parameters[name] = value;
	},

	getParameters: function(){
		return this._parameters;
	},

	addVariable: function(name, value){
		this._variables[name] = value;
	},

	getVariable: function(name){
		return this._variables[name];
	},

	getVariables: function(){
		return this._variables;
	},

	getVariablePairs: function(){
		var pairs = [];
		var name;
		for (name in this._variables)
			pairs.push(name + "=" + this._variables[name]);
		return pairs;
	},

	getHTML: function(){

//		var src = + (pairs ? "?"+pairs : "");
		var src = this.getAttribute("src");
		var pairs = this.getVariablePairs().join("&").trim();
		if (pairs) this.addParameter("flashvars", pairs);
		var embed = '<embed type="application/x-shockwave-flash" src="' + src
					+ '" width="'+ this.getAttribute("width") + '" height="' + this.getAttribute("height") + '" ';
		var param = '<param name="movie" value="' + src + '" />';

		var parameters = this.getParameters();
		for(var name in parameters){
			param += '<param name="' + name + '" value="' + parameters[name] + '" />';
			embed += name + '="' + parameters[name] + '" ';
		}

		embed += "/>";
		var html = '<object id="'+ this.getAttribute("id") +'" classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000"'
				+ ' width="' + this.getAttribute("width") + '" height="' + this.getAttribute("height") + '">'
				+ param + embed + "</object>";

		return html;
	},

	write: function(target){
		if (this.installedVersion.isValid(this.getAttribute("version"))) {
			$("#"+target).html(this.getHTML());
		}
	}
};

Flash.PlayerVersion = Class.create();
Flash.PlayerVersion.prototype = {
	initialize: function(version){
		this.major = (version[0] && !isNaN(parseInt(version[0]))) || 0;
		this.minor = (version[1] && !isNaN(parseInt(version[1]))) || 0;
		this.rev   = (version[2] && !isNaN(parseInt(version[2]))) || 0;
	},

	isValid: function(fv){
		if(this.major < fv.major) return false;
		if(this.major > fv.major) return true;
		if(this.minor < fv.minor) return false;
		if(this.minor > fv.minor) return true;
		if(this.rev < fv.rev) return false;
		return true;
	}
};

Flash.getPlayerVersion = function(){
	var version = new Flash.PlayerVersion([0, 0, 0]);
	var axo = null;
	if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length){
		var plugin = navigator.plugins["Shockwave Flash"];
		if(plugin && plugin.description) {
			version = new Flash.PlayerVersion
					(plugin.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
		}
	}else{
		var shockwaveFlash = ["ShockwaveFlash.ShockwaveFlash.9",
							  "ShockwaveFlash.ShockwaveFlash.8",
							  "ShockwaveFlash.ShockwaveFlash.7",
							  "ShockwaveFlash.ShockwaveFlash"];
		for (var i=0; i<shockwaveFlash.length; i++){
			try{
				axo =  new ActiveXObject(shockwaveFlash[i]);
				break;
			}catch (e){}
		}
		if (axo != null){
			version = new Flash.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
		}
	}
	return version;
};

Flash.clear = function(){
	$.each($A(document.getElementsByTagName("OBJECT")),function(index,obj){
		if (obj.classid.toUpperCase() == "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000"){

			for (var i in obj){
				if ($.isFunction(obj[i])) obj[i] = null;
			}
		}
	});
}

//快速排序算法
function doSort(arr,l,r,les,lar)
{
 	if(l<r)
 	{
 		var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1;
		while(true)
		{
			while(les(arr[++i],mid));
			while(lar(arr[--j],mid));
			if(i>=j)
				break;
			var temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		}
        doSort(arr,l,i-1,les,lar);
		doSort(arr,j+1,r,les,lar);
	}
	return arr;
}
//向数组附加快速排序算法
Array.prototype.quickSort = function (les,lar) {
    doSort(this, 0, this.length - 1,les,lar);
};

