var createRequest = function() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else {
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}
var queryString=function(_56,_57){
	if(arguments.length==1&&(typeof (_56)=="string"||(typeof (_56.nodeType)!="undefined"&&_56.nodeType>0))){
		var kv=MochiKit.DOM.formContents(_56);
		_56=kv[0];
		_57=kv[1];
	}else{
		if(arguments.length==1){
			var o=_56;
			_56=[];
			_57=[];
			for(var k in o){
				var v=o[k];
				if(typeof (v)!="function"){
					_56.push(k);
					_57.push(v);
				}
			}
		}
		var _5c=[];
		var len=Math.min(_56.length,_57.length);
		var _5e=urlEncode;
		for(var i=0;i<len;i++){
			v=_57[i];
			if(typeof (v)!="undefined"&&v!==null){
				_5c.push(_5e(_56[i])+"="+_5e(v));
			}
		}
		return _5c.join("&");
	}
}
var urlEncode=function(_6e){
	if(typeof (encodeURIComponent)!="undefined"){
		return encodeURIComponent(_6e).replace(/\'/g,"%27");
	}else{
		return escape(_6e).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
	}
}
var remoteAction = function(method, action, params, whenDone, sendRequest) {
	var theURL=action;
	if (action.charAt(0) == '/' || action.indexOf("http:")>=0) {
		theURL = action
	}else {
		theURL = '/'+action
	}
	var postdata = '';
	if (params) {
		postdata = queryString(params);
		if (postdata && (method == "GET")) {
			theURL = theURL + "?" + postdata;
			postdata = "";
		}
	}
	var req = createRequest();
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (whenDone) whenDone(req.responseText);
		}
	}
	sendRequest(req, theURL, postdata);
}

var asyncCommand = function(commandType) {
	return function(action, params, whenDone) {
	
		remoteAction(commandType, action, params, whenDone, 
			function(req, theURL, theData) {
				req.open(commandType, theURL, true);
				req.setRequestHeader('HTTP-Command-Equiv', commandType);
				req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				req.send(theData);
			})
	}
}

function setAjaxProxyReady(boo){
	ajaxProxyReady=boo;
}
function asyncProxy(action,paraArray,callback){
	if(!ajaxProxyReady){
		setTimeout(function(){return asyncProxy(action,paraArray,callback);},500);
		return false;
	}
	var myFr=$('jProxy').contentWindow || document.frames['jProxy'];
	myFr.postData(action,paraArray,callback);
	return false;
}
var asyncAction = asyncCommand("POST");
var asyncPut = asyncCommand("PUT");
var asyncDelete = asyncCommand("DELETE");

var asyncJson = function(method, action, params, whenDone) {
	remoteAction(method, action, params, whenDone, 
		function(req, theURL, theData) {
			if (theURL.charAt(0) != '/') {
				theURL = '/' + theURL;
			}
			theURL = '/accept/application/x-json' + theURL;
			req.open(method, theURL, true);
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.setRequestHeader('x-http-command-equiv', method);
			req.send(theData);
		});
}


/* From Skins */
var fill = function(node, fillers) {
	if (node) {
		if (node.getAttribute) {
			var slot = getNodeAttribute(node, 'x:slot');
			if (slot) {
				var filler = fillers[slot];
				if (filler) {
					replaceChildNodes(node, filler);
				}
			}
			var visible = getNodeAttribute(node, 'x:visible');
			if (visible && (false == fillers[visible])) {
				// alert(visible);
				node.parentNode.removeChild(node);
				return;
			}

			var attrs = getNodeAttribute(node, 'x:attr');
			while (attrs) {
				var colonPos = attrs.indexOf(':');
				var key = attrs.substring(0, colonPos);
				key = key.replace("_", ":");
				var commaPos = attrs.indexOf(',');
				if (commaPos != -1) {
					var value = attrs.substring(colonPos+1, commaPos);
					attrs = attrs.substring(commaPos+1);
				} else {
					var value = attrs.substring(colonPos+1);
					attrs = '';
				}
				if (fillers[value]) {
					node.setAttribute(key, fillers[value]);
				}
			}
			var attrs = getNodeAttribute(node, 'x:text');
			if (attrs) {
				var text = fillers[attrs];
				if (undefined != text) {
					replaceChildNodes(node, text);
				}
			}
		}
		for (var i = 0; i < node.childNodes.length; i++) {
			fill(node.childNodes[i], fillers);
		}
	}
}

var AllObservers = {}
var AllModelData = {}
var obkeyIndex = 0;
var observe = function(key, observer) {
	if (! AllObservers[key]) {
		AllObservers[key] = {};
	}
	var obkey = String(obkeyIndex++) + ":" + key;
	if (observer) {
		AllObservers[key][obkey] = observer;
	}
	if (AllModelData[key]) {
		if (observer) {
			observer(AllModelData[key]);
		}
	} else {
		execute(key);
	}
	return obkey;
}

var unobserve = function(obkey) {
	if (obkey) {
		var colonPos = obkey.indexOf(':');
		var key = obkey.substring(colonPos+1);
		delete AllObservers[key][obkey];
	}
}

var reobserve = function(key, observer) {
	delete AllModelData[key];
	observe(key, observer);
}

var _patterns = null;

var walk = function(node, prefix) {
	if (node.nodeType == 1) {
		try {
			var pattern = getNodeAttribute(node, 'x:pattern');
			if (pattern) {
				prefix += (prefix ? ':' : '') + pattern;
				_patterns[pattern] = node;
			}
			if (getNodeAttribute(node, 'x:dummy')) {
				node.parentNode.removeChild(node);
			}
		} catch (e) { }
	}
	for (var i = 0; i < node.childNodes.length; i++) {
		walk(node.childNodes[i], prefix);
	}
}
var getPatternMap = function() {
	if (_patterns == null) {
		_patterns = {};
		walk(document.documentElement, '');
	}
	return _patterns;
}

var getPattern = function(patternName) {
    var patterns = getPatternMap();
	return patterns[patternName].cloneNode(true);
}

var pattern = function(patternName, fillers) {
	var pat = getPattern(patternName);
	if (fillers) {
		fill(pat, fillers);
	}
	return pat;
}


var tkeys = function(d) {
   var r = [];
   for (var k=0;k<d.length;k++) {
	   if (k[d]) {
		   r.push(k);
	   }
   }
   return r;
}

var _pendingExecute = {}
var execute = function(key) {
	if ( ! _pendingExecute[key]) {
		_pendingExecute[key] = true;
		asyncJson("GET", key, {}, function(results) {
			delete _pendingExecute[key];
			if (results) {
				results = evalJSON(results);
			}
			if (results.length) {
				for (var i=0; i < results.length; i++) {
					var row = results[i];
					if (row.url && (row.url != key) ) {
						updateModel(row.url, row);
					}
				}
			}
			updateModel(key, results);
		});
	} 
}

var updateModel = function(key, results) {
	AllModelData[key] = results;
	var key_observers = AllObservers[key];
	for (var i=0;i<key_observers.length;i++) {
		var observer = key_observers[i];
		if (observer) {
			observer(results);
		}
	}
};


var deleteURL = function(command, observer) {
	asyncJson("DELETE", command, {}, observer);
}

var postURL = function(command, params, observer) {
	asyncJson("POST", command, params, observer);
}
//==prototype
Array.prototype.map=function(f) { 
	var arr=[];
	for(var i=0;i<this.length;i++)arr.push(f(this[i]));
	return arr;
}
ScriptFragment='(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
Object.extend = function(destination, source) {
	for(property in source)destination[property] = source[property];
	return destination;
}
Object.extend(String.prototype, {
	stripTags: function(){return this.replace(/<\/?[^>]+>/gi, '');},
	stripScripts: function(){return this.replace(new RegExp(ScriptFragment, 'img'), '');},
	extractScripts: function(){
		var matchAll = new RegExp(ScriptFragment, 'img');
		var matchOne = new RegExp(ScriptFragment, 'im');
		return (this.match(matchAll) || []).map(function(scriptTag) {
		  return (scriptTag.match(matchOne) || ['', ''])[1];
		});},
	evalScripts: function(){return this.extractScripts().map(eval);}
});
//=======end
function reNewSelect(type,value,obj,optionsAdd,defaultValue) {
	if(value=="" || value=="0"){
		obj.innerHTML=optionsAdd;
		return false;
	}
	var frm = {
		myactions : "options",
		type : type,
		value : value
	};
	asyncProxy(getPostRoot()+'/comservice',frm,
		function(ans){
			setOptions(obj,ans,optionsAdd);
			if(defaultValue)obj.value=defaultValue;
		});
	return false;
}
function reNewSelectForBJS(type,value,obj,optionsAdd,defaultValue) {
	if(value=="" || value=="0"){
		obj.innerHTML=optionsAdd;
		return false;
	}
	var frm = {
		myactions : "bjoptions",
		type : type,
		value : value
	};
	asyncProxy(getPostRoot()+'/comservice',frm,
		function(ans){
			setOptions(obj,ans,optionsAdd);
			if(defaultValue)obj.value=defaultValue;
		});
	return false;
}
function reNewSelectForSingBizz(type,value,obj,optionsAdd,defaultValue,sBizObj,optionsAddSB,sBizDef) {
	if(value=="" || value=="0"){
		obj.innerHTML=optionsAdd;
		return false;
	}
	var frm = {
		myactions : "options",
		type : type,
		value : value
	};
	asyncProxy(getPostRoot()+'/comservice',frm,
		function(ans){
			setOptions(obj,ans,optionsAdd);
			if(defaultValue)obj.value=defaultValue;
			splitBizzoneJS(sBizObj,obj.options[obj.selectedIndex].text,optionsAddSB);
			if(sBizDef) sBizObj.value=sBizDef;
		});
	return false;
}
function splitBizzoneJS(sBizObj,bizs,optionsAdd){
var spbizk = bizs.split(" ");
var spbiz;
if(spbizk.length==1){
spbiz = spbizk[0].split("/");
}
if(spbizk.length==2){
spbiz = spbizk[1].split("/");
}
var body=document.getElementsByTagName('body')[0];
var vO=createElement(body,"div");
var options;
for(var i=0;i<spbiz.length;i++){
options=options+"<option value="+spbiz[i]+">"+spbiz[i]+"</option>";
}
vO.innerHTML="<select>"+optionsAdd+options+"</select>";
var tS=vO.getElementsByTagName("select")[0];
sBizObj.innerHTML="";
var op;
for(var i=0;i<tS.options.length;i++){
	op=tS.options[i];
	sBizObj.options[sBizObj.options.length]=new Option(op.text,op.value);
}
body.removeChild(vO);
}
function setOptions(obj,options,optionsAdd){
	var body=document.getElementsByTagName('body')[0];
	var vO=createElement(body,"div");
	vO.innerHTML="<select>"+optionsAdd+options+"</div>";
	var tS=vO.getElementsByTagName("select")[0];
	obj.innerHTML="";
	var op;
	for(var i=0;i<tS.options.length;i++){
		op=tS.options[i];
		obj.options[obj.options.length]=new Option(op.text,op.value);
	}
	body.removeChild(vO);
}
function getPostRoot(){
	if(siteRoot)return "http://post."+siteRoot;
	return "";
}
function setMenuF(ind){
	if($(ind)){
		if(ind=="enterpriseMoreID" || ind=="reviewID" || ind=="eventsID" || ind=="guideID" || ind=="questionID" || ind=="userGID"){
			$(ind).className="on";
		}else{
			$(ind).className="ont";
			if(ind!='indexID')$("enterpriseMoreID").className="on";
		}
	}
}