var BrowseBy = Class.create({

	initialize: function(root, data) {

		this.resultObjects = new Array();

		//for now, main="company-info", and browseByRequestURL corresponds to that
		this.defaults = new Object();
		this.defaults.browseByRequestURL = "/www2/web/corpcomm/portal/browseByRequest.jsp";
		this.defaults.main = "company-info";
		this.defaults.sub = "";
		this.defaults.subSub = "";
		this.defaults.sort = "rank";
		
		this.browseByRequestURL = this.defaults.browseByRequestURL;
		this.main = this.defaults.main
		this.sub = this.defaults.sub;
		this.subSub = this.defaults.subSub;
		this.sort = this.defaults.sort;
		
		this.oldMain = "";
		this.oldSub = "";
		this.oldSubSub = "";
		
		if(root != undefined && data != undefined)
			this.build(root, data);
		
	},
	
	load: function(target, params) {
	
		//should accept: main, sub, subSub, sort
		if(params.main		!= undefined) this.main 	= params.main;
		if(params.sub			!= undefined) this.sub 		= params.sub;
		if(params.subSub	!= undefined) this.subSub = params.subSub;
		if(params.sort		!= undefined) this.sort 	=	params.sort;
		
		$(target).ancestors()[1].select(".open").each(function(s) {
			s.removeClassName("open");
		});
		$(target).ancestors()[0].addClassName("open");

		var subs = this.sub.split("/");
		this.subSub = subs[1];
		
		if(this.main == "company-info") {
			this.browseByRequestURL = "/www2/web/corpcomm/portal/browseByRequest.jsp";
		}
		
		var bb = this;
		var browseByRequestURL = this.browseByRequestURL;
		
		//because of the proxy, the parameters need to be added directly to the request url
		browseByRequestURL += "?type="+this.sub+"&sort="+this.sort;
		
		new Ajax.Request(browseByRequestURL, {
			
			method: 'get',
			
			onSuccess: function(transport) {
			
				var data = transport.responseXML.documentElement.getElementsByTagName("result");
				
				var bbData = new Array();
				
				//loop through the list of results
				for(var i=0; i < data.length; i++) {
				
					var obj = new BrowseByResult();
					obj.id = data[i].attributes.getNamedItem("id").nodeValue;
					obj.title = data[i].getElementsByTagName("title")[0].firstChild.nodeValue;
					if(data[i].getElementsByTagName("url")[0].firstChild != null)
						obj.url = data[i].getElementsByTagName("url")[0].firstChild.nodeValue;
					obj.expand = data[i].getElementsByTagName("expand")[0].firstChild.nodeValue;
					bbData.push(obj);
				}
				
				bb.build(target, bbData, null);
				
			}
			
		});
		
	},
	
	build: function(target, data, level) {
	
		//builds a sub-div within target using data
		var bb = this;
		var target = $(target);
		
		$(target).update('');
		
		if(data.length > 0) {
		
			$(target).hide();
		
			for(var i=0; i < data.length; i++) {
				var navItem = $(target).insert(data[i].toHTML());
				this.resultObjects[(data[i].id)] = data[i];
			}
			
			$(target).childElements().each(function(el) {
				var t = el.down(".label");
				t.stopObserving("click");
				t.observe("click", function(s) {
				
					el.siblings().each(function(t) {
						new Effect.BlindUp(t.down('.sub'), {duration: 0.2});
					});
				
					bb.resultObjects[(el.id)].click(bb);
					
				});
			});
			
			new Effect.BlindDown(target, {duration: 0.35});
			
			$(target).fire('BrowseBy:buildComplete');
		
		}
		
	},
	
	navigate: function(id) {
		location.replace(location.pathname + "?main=" + this.main + "&sub=" + this.sub.split("/")[0] + "&subSub=" + this.subSub + "&id=" + id);
	}

});

var BrowseByResult = Class.create({
	
	initialize: function(id, title, url, expand) {
		this.id = id;
		this.title = title;
		this.url = url;
		this.expand = expand;
	},
	
	toHTML: function() {
		var template = new Template('<div id="#{id}" expand="#{expand}" url="#{url}"><div class="label">#{title}</div><div class="sub"></div></div>');
		return template.evaluate( {id: this.id, title: this.title, url: this.url, expand: this.expand} );
	},
	
	click: function(bb) {
		if(this.url != "" && this.url != undefined && this.url != null) {
			if(this.url.indexOf("javascript:") == 0) {
				eval(this.url.substr(11));
			} else {
				window.open(this.url, "browsebylink", "height=500,width=600,location=yes,resizable=yes,menubar=no,scrollbars=yes,status=no,titlebar=yes,toolbar=no");
				//alert("Open URL: " + el.getAttribute("url"));
			}
		} else if(this.expand == "true") {
			var sub = this.id;
			if($(this.id).up('.sub') != undefined) {
				sub = $(this.id).up('.sub').ancestors()[0].id + "/" + this.id;
			}
			bb.load($(this.id).down(".sub"), {"sub": sub});
		} else {
			bb.navigate(this.id);
		}
	}
	
});
