redux={}; redux.enabled=true; redux.layer={}; redux.event={};

function rxurl(v) {	

	// strip http:domain if exists and from same domain
	var test=window.location.protocol + '//' + document.domain + '/';
	if (v.substring(0,test.length) == test) {
		v=v.substring(test.length,v.length);

	}

	switch (v.substring(0,1))
	{
		case '/': v=v.substring(1,v.length); break;
		case '?': return (redux.page.url.split('?')[0] + v); break;
	} 

	var tmp=v.split('?')[0].split('.');
	switch (tmp[tmp.length-1].substring(0,3)) 
	{
		case "cfm": break;
		default: return false; break;
	}
	
	switch (v.split(':')[0]) 
	{
		case "javascript": return false; break;
		case "mailto": return false; break;
		case "file": return false; break;
		case "https": if (window.location.protocol == 'http:') {return false} else {break};
		case "http": break;
		default: 
			return v;
			var u=redux.page.name.split("/");
			if (u.length>2) {
				u[u.length-1]=v;
				return u.join("/");
			} else {
				return v; 
			}
		break;
	}
	
	return v;
}

function rxclick(o) {
	var v = rxurl($(o).get('href'));
	if (!v) return true;

	var chash=v.split('#');
	if (chash.length > 1) {
		redux.loadAsset([{url:'/inc/redux/26/moo/scroller.js',type:'JS',title:'moo_scroller',id:'moo_scroller'}]);
		redux.useAsset({asset:'moo_scroller',run:function()
		{
			var element=$(document).getElement('a[name='+chash[1]+']');
			var myFx = new Fx.Scroll(window).start(0,element.getPosition().y);
		}}); 
		return false;
	}

	redux.get(v,true);
	return false;
}

function rxsubmit(o) {
	var out=new Array(); var an={}; var a=new Array();

	var x1=$(o).getElements('select,input,textarea');
	$each(x1,function(o){
		if (o.name) {
			
			if (['checkbox'].contains(o.type) && !o.getProperty('checked')) return;
			if (['radio'].contains(o.type) && !o.getProperty('checked')) return;
			if (['select-one'].contains(o.type) || ['select-multiple'].contains(o.type) ){
				if (!an[o.name]) an[o.name] = [];
				
				var co=an[o.name];
				
				for(i=0;i<o.length;i++){
					if(o[i].selected){
						co.push(o[i].value);
						
					}
				}
				
				return;
			}
			if (['submit'].contains(o.type) || ['image'].contains(o.type)) {
				if (o.getProperty('clicked') != null) {
					if (!an[o.name]) an[o.name]=[];
					fv=encodeURIComponent(o.value);
					o.removeProperty('clicked');
				}
			} else {
				if (!an[o.name]) an[o.name]=[];
				//Check to see if there is a custom submit value (used by editors, etc).
				var fv=encodeURIComponent(o.submitValue?o.submitValue():o.get('value'));
			}
			if (fv) {var co=an[o.name]; co.push(fv);}
		}
	});
	
	
	
	for (var x in an) out.push(x+'='+an[x].join(","));
	var str=rxurl(o.get('action'));
	if (!str) return true;     
	
	if (o.get('method')=='get') { 
		redux.get(str+"?"+out.join("&"),true);
	} else {
		redux.get(str,true,out.join("&")); 
	}
	
	return false;
}

// Asset functions
redux.assets = {};
redux.useAsset = function(o) {
	if (!this.assets[o.asset]) this.assets[o.asset]={}; 
	if (this.assets[o.asset]) {
		var asset = this.assets[o.asset];
		if (asset.loaded) {
			o.run.call(redux)
		}
		else {
			if (!asset.queue) asset.queue = [];
			asset.queue.push(o.run);
			//if (window.console) console.debug('useasset!' + o.asset);
		}
		
	} else {
		//if (window.console) console.debug('cant find' + o.asset);
	}
}

redux.initAsset = function(a,u,t) {
	if (!this.assets[a]) this.assets[a]={}; 
	var asset=this.assets[a];
	asset.loaded=true;
	asset.url=u;
	asset.t=t;
	if (asset.queue) {
		for(i=0;i<asset.queue.length;i++) {
			asset.queue[i].call(window);
		}
		asset.queue=[];
	} 
}

redux.reloadAsset = function(a) {
	var asset=redux.assets[a];
	if (asset.t == 'JS') {
		new Asset.javascript(asset.url+'?'+(new Date().getTime()));
	} else {
		new Asset.css(asset.url+'?'+(new Date().getTime()));
	}
}

redux.loadAsset = function(r) {
	for(res=0; res<r.length; res++) {
		var c=r[res];
		if (c.type=='CSS') {
			var found=false;
			for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
				
				if (a.id) {
					var ida=a.id.split('-');
					if (ida.length==2) {
						if (c.title==ida[0]) {
							if (ida[1]==c.id) {
								if (!c.disabled) a.disabled=false; 
								found=true;
							} else {
								if (!c.disabled) a.disabled=true;
							}
						}
					}
				}
			}
			if (!found) {
				(function(url,id,title,disabled){
					var newlink = new Asset.css(url, {'id': title + '-' + id});
					newlink.disabled=((disabled)?true:false);
					redux.initAsset(id,url,'CSS');
				})(c.url,c.id,c.title,c.disabled);
			}
		}
		if (c.type=='JS') {
			if (!this.assets[c.id] || !this.assets[c.id].loaded) {
				if (!c.url){
					this.initAsset(c.id);
				} else {
					if (!this.assets[c.id]) this.assets[c.id]={};
					(function(url,id){
						new Asset.javascript(url, ({'onload': 
							function(){redux.initAsset(id,url,'JS');}
						}));
					})(c.url,c.id);
				}
			}
		}
	}
}

// LOAD IN PAGE, SECTIONAL OR GLOBAL CACHES
redux.loadCache = function(o) {
	if (!redux.pageCache) redux.pageCache=o;
} 

redux.clearObjects = function (o) {
	if (!redux.object) redux.object={};
	for(res=0; res<o.length; res++) {		
		var c=o[res]; var co=$(c.o);
		if (!c.hook && c.h && co ) co.empty();
	}
}

redux.setObjects = function (objs,page) {
	if (!this.object) this.object={};
	for(var res=0; res<objs.length; res++) {
		var c=objs[res];
		if (c.hook) {
			if (this[c.hook]) var hook=this[c.hook];
			if (window[c.hook]) var hook=window[c.hook];
			if (hook) c.vars?hook.call(this,c.o,c.h,c.vars):hook.call(this,c.o,c.h);
		} else {
			if (c.h) {
				if ($(c.o)) {(c.h!='')?$(c.o).set('html',c.h.stripScripts(true)):$(c.o).empty()};
			}
			
			if (!this.object[c.o]) this.object[c.o]={};
			var desc=this.object[c.o].desc?this.object[c.o].desc:false; 
			var def=this.object[c.o].def?this.object[c.o].def:false;
			//$extend(this.object[c.o],c);
			//if (c.h) this.object[c.o].h=c.h;
			this.object[c.o]=c;
			if (c.t) this.object[c.o].type=c.t;
			if (desc) this.object[c.o].desc=desc;
			if (def) this.object[c.o].def=def;
		}
		if ($(c.o))	c.t==2?$(c.o).setProperty('page',page):$(c.o).removeProperty('page');	
	}
}

redux.load = function (o) {
	//if (o.name) redux.bundle=o;
	if (o.name) this.pagename=o.name;
	if (o.query) this.pagequery=o.query;
	if (o.uid) this.uid=o.uid;
	if (o.history) {
		this.sid=o.sid;
		this.tid=o.tid;
		this.page=o;
		
		$(document.body).getElements('.currenturl').removeClass('currenturl');
		$(document.body).getElements('a[href$=' + o.url + ']').addClass('currenturl');
		//if (tmp) tmp.addClass('currenturl');
		
		historySet(o.url);
		if (o.title && document.title) document.title=o.title;	
	}
		
	if (o.onstart) o.onstart.call(this);
	if (o.history) this.event.run.call(this,'onbeforeload','page='+o.name);
	if (o.resource) this.loadAsset(o.resource);
	if (o.object) this.setObjects(o.object,o.name);
	
	this.set();
	if (window.urchinTracker) {urchinTracker(getPage())}
	if (o.onload) o.onload.call(this);
	
	if (window.admin_init) { 
		admin_init(o.object);
		if (o.resp || o.resp==0) {
			if (this.timer) {
				var t=new Date().getTime()-this.timer;
				$('pageInfo').innerHTML='Page Load ' + o.resp + '/' + t + 'ms';}
			else {
				$('pageInfo').innerHTML='CGI:' + o.resp + 'ms';
			}
		}
	}
	if (o.history) this.event.run.call(this,'onload','page='+o.name);
	this.event.run.call(this,'oncomplete','page='+o.name);
}

redux.set = function () {
	if (!redux.enabled) return;
	uRevert=null;
	var rxlinks=document.links;	
	for (var i=0; i<rxlinks.length; i++) {
		if (!rxlinks[i].onclick && !rxlinks[i].target) {
			rxlinks[i].onclick=function() {return rxclick(this)}
		}
	}
	var i=0;
	$each($$('form'),function(ol){
		if (!ol.getProperty("target") && !ol.get('rx_proc')) {
			$each($$('input',ol),function(input){
				if((['submit'].contains(input.type) || ['image'].contains(input.type)) && input.getProperty('name')) {
					
					if (input.onclick && !input.oldclick) input.oldclick=input.onclick;
					input.onclick=function() {
						this.setProperty('clicked',true);
						if (this.oldclick) this.oldclick();
					}
					if (!input.oldclick) input.oldclick=function(){};
				}
			});
			ol.addEvent('submit', function(event){return rxsubmit(this)});
			ol.set('rx_proc',true);
		}
	});
}

redux.get = function(n,h,v) {
	var pass2=''; var pass1='';
	for (var x in redux.object)
	{
		
		var tmp=redux.object[x];
		if (tmp.type==1) {pass1+=x+';'}
		if (tmp.type==2) {pass2+=x+';'}
	}
	
	var rxt=redux.sid+':'+redux.tid+':'+((pass1=='')?0:pass1)+':'+((pass2=='')?0:pass2);	
	var src = '/' + n + ((n.indexOf("?") > 0)?'&':'?')  + 'rxtype=' + rxt + '&ts=' + (new Date().getTime()) + '-' + redux.uid;


	var x=n.indexOf('form=true');
	if (x > 0) n=n.substring(0,x-1);
	redux.timer=new Date().getTime();
	if(this.tracker) this.tracker.pushPacket('p',(v)?n+'?'+v:n);
	window.location.loading=h?n:false;
	this.event.run.call(this,'onget','page='+src);
	
	if(redux.pageCache && redux.pageCache[n.toLowerCase()]) {
		redux.load(redux.pageCache[n.toLowerCase()]);
		return;
	}	
	
	var myXHR = new Request({url:src, method: (v)?'post':'get', onSuccess: function(r){ 
		redux.load(JSON.decode(r));
	}}).send(v);	
	
}

/// EVENT FUNCTIONS

redux.event.create = function(e,f,once) {
	var ev={};
	ev.func=f; ev.once=once;
	if (!redux.event[e]) redux.event[e]=[];
	redux.event[e].push(ev);
}

redux.event.run = function(e,v) {
	if (this.event[e]) {
		var o=this.event[e];
		var el=o.length;
		for(var i=0; i<el; i++) {
			if (o[i].id) {
				if ($(o[i].id)) {
					var out=o[i].url+((v)?'&'+v:'');
					this.get(out);
				}
			} else {
				if (o[i].func) {
					o[i].func.call(this,v);
					if (o[i].once) o[i]={};
				}
			}
		}
	}
}      

redux.resolve = function (packet) {	
	if (packet.MESSAGES) {
		for (var x in packet.MESSAGES) {
			var message=packet.MESSAGES[x];
			hook=redux[message.HOOK];
			if (!hook) hook=window[message.HOOK];
			if (hook) message.VAR?hook.call(redux,message.VAR):hook.call(redux);
		}
	}
}

function historySet(n) {
	if (window.poll) clearTimeout(poll);
	if (window.location.loading) window.location.hash=getPage();
	
	if (Browser.Engine.trident) {
		if (window.location.hash=='' || window.location.loading) historyAdd(getPage());
	} else {
		poll=setTimeout('rPoll()',300);
	}
}

function historyResolve(hist) {
	if (getPage()!=hist) {
		redux.get(hist,false);
		window.location.hash=hist;
	}
}

function historyAdd(hist) {
	window.historyObj.document.write("<html><body><script>parent.historyResolve('"+hist+"');<\/script></body></html>");
	window.historyObj.document.close();	
	return void(0);
}

function getPath() {
	var rPath=window.location.pathname; 
	var rSearch=window.location.search; 
	rPath=rPath.substring(1,rPath.length); 
	var rPathArray=rPath.split('/');
	if (rPathArray[rPathArray.length-1]=='') {
		rPath=rPath+'index.cfm';
	}	
	if (rSearch!='') rPath=rPath+rSearch;
	return rPath
}
function getPage() {var rPage=redux.page.url; if (redux.page.query) rPage=rPage+'?'+redux.page.query; return rPage}


function rPoll() {	
	if (!redux.enabled) return;
	var rHash=window.location.hash; rHash=unescape(rHash.substring(1,rHash.length));
	var rPage=unescape(getPage()); var rPath=unescape(getPath());
	//console.debug(rPage + ' page - (' + rHash + ') hash','redir!');
	if (rHash!=rPage && rHash!='') {
		redux.get(rHash,false);
	} else {
		//console.debug(rPath + ' Path - ' + rPage + 'Page','redir!');
		if (rHash=='' && rPath!=rPage) {
			redux.get(rPath,false);
		} else {
			poll=setTimeout('rPoll()',300);
		}
	}
}

redux.cache=[];
redux.saveCache = function(h) {
	this.cache.push(h);
	return this.cache.length-1;
}
redux.getCache = function(id) {return this.cache[id]}
redux.displayCache = function(id) {
	redux.createWindow('debug_detail',this.cache[id],{title:'Debug Window',width:500});
}

function qdebug(text,name) {
	var dstruct={};
	dstruct.desc=text;
	dstruct.name=name;
	debug('','Trace',dstruct);
}

function debug(he,h,options) {
	var curtime = new Date();
	if (!options) options={};
	
	h = '<a onclick="redux.displayCache(' + redux.saveCache(h) + ')">' + (options.desc?options.desc:'Debug') + '</a>';
	h = '<div class="' + ((he)?'debug_error':'debug_date') + '">'+(curtime.getHours()<10?'0'+curtime.getHours():curtime.getHours()) + ':' + (curtime.getMinutes()<10?'0'+curtime.getMinutes():curtime.getMinutes()) + ':' + (curtime.getSeconds()<10?'0'+curtime.getSeconds():curtime.getSeconds()) + ' ' + (options.type?options.type:'Debug') + '</div><div class="debug_item">' + h + '</div>';
	
	var o=$('window_debug_content');
	if (!o) {
		redux.createWindow('debug',h,{title:'Debug Window'});
	} else {
		var el=new Element('div');
		el.set('html',h);
		el.inject(o,'top');
	}
}


function moresize(id,draw) {
	var ci = MochaUI.Windows.instances.get(id);
	var cw = ci.contentWrapperEl;
	var ssize = cw.getScrollSize();
	if (ci.options.width < ssize.x) {
		ci.options.width=ssize.x;
		cw.setStyle('width', ssize.x);
	}
	var wsize = $(window).getSize();
	var ssize = cw.getScrollSize();
	if (wsize.y<ssize.y) ci.options.y=20;
	if (ci.options.height < ssize.y) {
		ci.options.height=ssize.y;
		cw.setStyle('height', ssize.y);
	}
	if (draw) {ci.drawWindow($(id));}
}

redux.createWindow = function(id,h,opt) {
	if (!opt) var opt={};
	if (!opt.scrollbars) opt.scrollbars=false;
	opt.restrict=false;
	opt.id=(opt.id)?"window_"+opt.id:"window_"+id;
	if (opt.overwrite) {
		MochaUI.closeWindow($(opt.id));
	}	
	if ((h.length==0 || opt.close) && (window.MochaUI)) {
		if (!$(opt.id+'_content')) return;
		MochaUI.closeWindow($(opt.id)); 
		return;
	}
	if (!opt.title) {
		// Yank h1 and set title
		var xp=new RegExp("<\s*h1[^>]*>(.*?)<\s*/\s*h1>","g");
		var ret=xp.exec(h);
		if (ret) {if (ret.length > 1) opt.title=ret[1]; h=h.replace(ret[0],"");}
	}
	// check to see if window exists
	var o=$(opt.id+'_content');
	if (o) {
		o.set('html',h); 
		$(opt.id+'_title').set('html',opt.title);
		if (!opt.width || !opt.height) moresize(opt.id,true);
		return;
	}
	if (!opt.padding) opt.padding={top:0,right:0,bottom:0,left:0};
	opt.content=h;
	if (!opt.width || !opt.height) opt.onContentLoaded=function(o){moresize(o.id)}
	redux.loadAsset([{url:'/inc/redux/30/mochanew/mocha.css',type:'CSS',title:'mocha_ui',id:'mocha_ui'}]);
	redux.loadAsset([{url:'/inc/redux/30/mochanew/mocha.js',type:'JS',title:'mocha',id:'mocha'}]);
	
	redux.useAsset({asset:'mocha',run:function()
		{
			
			if (!window.modalset) {
				MochaUI.underlayInitialize();

				window.modalset=true;	
			}
			

			(opt.type=='modal' || opt.type=='modal2')?new MUI.Modal(opt):new MochaUI.Window(opt);
			
			//new MochaUI.Window(opt);
			//new MUI.Modal(opt);
	
			var o=$(opt.id+'_content');
			o.setProperty("page",redux.pagename);
			if (window.attachContext && o) attachContext(o,id.split('-')[0]);
			redux.set();
		}});
}

function oModeless(el,c,w) {
	redux.createWindow(el,c,w);
}
function oModal(el,c,w) {
	if (!w) {w={}; w.type='modal';}
	redux.createWindow(el,c,w);
}

/* SET UP SUCKERFISH MOUSEOVERS FOR IE6 AND HISTORY OBJECT */
if (Browser.Engine.trident) {
	document.write('<iframe src="/inc/redux/blank.html" style="width:10px; height:10px; position:absolute; left:0px; visibility:hidden;" id="historyObj" name="historyObj"></iframe>');
	if (Browser.Engine.version < 5) { 
		var sfEls = document.getElementsByTagName("LI");
		for (var i=0; i<sfEls.length; i++) {
			$(sfEls[i]).addEvent('mouseenter', function() {this.className+=" sfhover";});
			$(sfEls[i]).addEvent('mouseleave', function() {this.className=this.className.replace(new RegExp(" sfhover\\b"), "");});
		}
	}
	var sffEls = document.getElementsByTagName("INPUT");
		for (var j=0; j<sffEls.length; j++){
			$(sffEls[j]).addEvent('focus', function() {this.className+=" sffocus";});
			$(sffEls[j]).addEvent('blur', function() {this.className=this.className.replace(new RegExp(" sffocus\\b"), "");});
		}
}

/* IF PAGE IS LOADING FOR THE FIRST TIME AND THERE IS A HASH THEN RELOCATE TO HASH LOCATION */
if (window.location.hash!="") {
	var tmp=window.location.href.split('#');
	redux.event.create("oncomplete",function() {
		redux.get(unescape(tmp[1]),false);
	},true);
}

/* CATCH AND DONT RUN DOCUMENT.WRITES */
document.write=function(o) {}

function enableCollapsibles(s){
	
	
	//list of target elements
	var list = $$('div.collapse, li.collapsor ul');
	//list elements to be clicked on
	var headings = $$('div.collapser, li.collapsor');
	
		
		headings.addClass('collapsible');
		
	// checking for alternative open states
	if (s != undefined) {
		var start = s;
	}
	else {
		var start = 0
	}
	//array to store all of the collapsibles
	var collapsibles = new Array();
	
	
	var collapsible = new Accordion(headings, list, {
		onActive: function(toggler, element){
			toggler.addClass('map_detail_show_more');
		},
		onBackground: function(toggler, element){
			toggler.removeClass('map_detail_show_more');
		},
		alwaysHide: true,
		display: start
	});

	headings.removeClass('collapsor');
	//headings.removeClass('collapser');

}

enableCollapsibles(-1);
//	{url:'/inc/redux/30/invue.js',type:'JS',title:'Tracker',id:'Tracker'},

redux.loadAsset([
	{url:'/inc/redux/30/slimbox/slimbox.js',type:'JS',title:'Slimbox',id:'Slimbox'},
	{url:'/inc/redux/30/slimbox/css/slimbox.css',type:'CSS',title:'Slimbox_style',id:'Slimbox_style'}	
]);


