// profile
var slide;
var scroller;
var current_index;

function KeyMarkets(market_list_id, slide_id) {
	var tmp_m = $(market_list_id).childElements();
	var tmp_i = $(slide_id).firstDescendant().childElements();

	this.market_list = new Array(tmp_m.length);
	this.image_list = new Array(tmp_i.length);
	
	slide = slide_id; // so we know what to slide
	
	this.block_width = 248;
	this.block_padding = 6;
		
	if (this.market_list.length == this.image_list.length) {
		for (var i = 0, j = this.market_list.length; i < j; i++) {
			this.market_list[i] = new MarketListItem(tmp_m[i]);
			//attach_market_funcs(i, this);
		}
	}
	else {
		alert("Every key market requires an image.");
	}
}

function MarketListItem(content) {
	this.content = content;
}

KeyMarkets.prototype.init = function() {
	this.interval_id = -1; // scroller state
	scroller = new SmoothMovement(0, 0);			
	this.market_list[0].select();
	current_index = 0;
	var k = this;
	window.setInterval(function() {
		k.scrollTo();
	}, 5000);
};

KeyMarkets.prototype.scrollTo = function() {
	// deselect the last selected item, select the given item, scroll to the selected item	
	if (this.interval_id != -1){
        if (!scroller.hasStopped()) {
            return;
        }	    
    }	
    window.clearInterval(this.interval_id);	    
	this.market_list[current_index].deselect();
	current_index = (++current_index % this.market_list.length);
    scroller.changeTarget(-1 * current_index * (this.block_width + this.block_padding));
	this.interval_id = window.setInterval(this.update_scroll, this.speed);
	this.market_list[current_index].select();
};

KeyMarkets.prototype.update_scroll = function() {
	$(slide).style.left = scroller.updatePosition() + 'px';
};

MarketListItem.prototype.select = function() {
	this.content.className = 'selected';
};

MarketListItem.prototype.deselect = function() {
	this.content.className = '';
};

function attach_market_funcs(i, km) {
	km.market_list[i].content.onclick = function() {
		km.scrollTo(i);
	}
}

// rollovers
function lea_over(img, url){
    if(!img.oldSrc) img.oldSrc=img.src;
    img.src = url;
}
function lea_out(img){
    if(img.oldSrc) img.src=img.oldSrc;
}

// positions
var moving = false;

function finished() {
	moving = false;
}

function starting() {
	moving = true;
}

function LoadPositions(className) {
	var a = [];
	a = document.getElementsByClassName(className);
	for (var i = 0, j = a.length; i < j; i++) {
		$(a[i]).firstDescendant().isclosed = true;
		$(a[i]).firstDescendant().className = "title closed";
		$(a[i]).firstDescendant().next().hide();
		attach_pos_funcs($(a[i]).firstDescendant(), $(a[i]).firstDescendant().next());
	}
}

function attach_pos_funcs(title, content) {
	title.onclick = function() {
		if (!title.isclosed && content.visible() && !moving) {
			title.isclosed = true;
			title.className = "title closed";
			content.visualEffect('blind_up',{duration:.5, beforeStart:starting, afterFinish:finished});
		} else if (!(content.visible()) && !moving){
			title.isclosed = false;
			title.className = "title open";
			content.visualEffect('blind_down',{duration:.5, beforeStart:starting, afterFinish:finished});
		}
	};
}

// generic
function hide_element(el) {
	el.className = "hidden";
}

// projects
var desc_up = true;
var max_scroll_height = 525;
var scroll_button_height = 32;
var old_proj_top = 0;
var proj_scroll_interval;

function ProjectCategory(hide_desc) {
	// build an array of Projects, load the first one unless we have one specified
	var tmp_list = $('projects').childElements()[1];
	var tmp_p = $('projects').descendants()[1].childElements();
	var desc_button = $('project_footer').descendants()[5];
	var proj = location.search.toQueryParams().proj;
	var load = 0;
	
	desc_up = hide_desc;
	
	moving = false;
	
	
	if (tmp_list.scrollHeight > max_scroll_height) {
		ProjectScrollInit();
	}	
	desc_button.onclick = function() {
		if (!moving && !desc_up) {
			$('project_body').descendants()[0].visualEffect('appear',{duration:.5,beforeStart:starting, afterFinish:finished});
			desc_up = true;
		} else if (!moving && desc_up) {
			$('project_body').descendants()[0].visualEffect('fade',{duration:.5,beforeStart:starting, afterFinish:finished});
			desc_up = false;
		}
	};
	
	this.project_list = new Array(tmp_p.length);

	for (var i = 0, j = tmp_p.length;i < j;i++) {
		if (tmp_p[i].id == proj  && load == 0) {
			load = i;
		}
		this.project_list[i] = new Project(tmp_p[i]);
	}
	this.project_list[load].Load();
}

function ProjectScrollInit() {
		$('up').className = 'project_scroll';
		$('down').className = 'project_scroll active';
		
		$('up').onclick = ProjScrollUp;
		$('down').onclick = ProjScrollDown;
		$('projects').descendants()[1].setStyle('top:' + scroll_button_height + 'px;');
		old_proj_top = scroll_button_height;
		
		project_scroll_interval = -1;
		scroller = new SmoothMovement(0, 0); // borrowing the key markets scroller		
}

function ProjScrollUp() {
	if (old_proj_top == scroll_button_height) {
		// at the top already
		return;
	}
	ProjScroll(true);
}

function ProjScrollDown() {	
	if (old_proj_top == scroll_button_height - ($('projects').childElements()[1].scrollHeight + (max_scroll_height - (scroll_button_height * 2)))) {
		// at the bottom already
		return;
	}
	ProjScroll(false);
}

function ProjScroll(up) {
	if (project_scroll_interval != -1) {
		if (!scroller.hasStopped()) {
			// still scrolling
			return;
		}
	}
	window.clearInterval(project_scroll_interval);
	old_proj_top = GetNewTop(old_proj_top, up, $('projects').childElements()[1]);
	scroller.changeTarget(old_proj_top);
	project_scroll_interval = window.setInterval(UpdateProjScroll, 15);
	if (old_proj_top == scroll_button_height) {
		$('down').className = 'project_scroll active';
		$('up').className = 'project_scroll';
	} else if (old_proj_top == scroll_button_height - ($('projects').childElements()[1].scrollHeight + (max_scroll_height - (scroll_button_height * 2)))) {	
		$('down').className = 'project_scroll';
		$('up').className = 'project_scroll active';
	} else {
		$('down').className = 'project_scroll active';
		$('up').className = 'project_scroll active';
	}
}

function UpdateProjScroll() {
	$('projects').childElements()[1].setStyle('top:' + scroller.updatePosition() + 'px');
}

function Project(c) {
	this.content = c;
	this.id = c.id;
	this.content.onclick = this.Load;
}

Project.prototype.Load = function() {
	// get the project information, populate my fields
	$('projects').descendants()[1].childElements().each(function(e) {
		e.className = '';
	});
	if (this.content) {
		this.content.className = 'current';
	} else {
		this.className = 'current';
	}
	
	new Ajax.Request('/index.php?id='+this.id, {
		method: 'get',
		onSuccess: function(transport) {
			LoadProject(transport.responseText);
		},
		onFailure: function(transport) {
			LoadProject('');
		}
	});
};

function LoadProject(text) {
	if (text.length > 0) {
		var p = eval(text);
		if (p) {
			$('project_header').descendants()[0].innerHTML = p[0].title;
			$('project_header').descendants()[1].innerHTML = p[0].location;
			$('project_body').descendants()[0].innerHTML = p[0].description;
			var img;
			if (p[0].image1.length > 0) {
				img = new Image();
				img.src = p[0].image1;
				$('project_footer').descendants()[0].src = p[0].image1;				
				$('project_footer').descendants()[0].onclick = function() { LoadImage(0); }
				$('project_footer').descendants()[0].className = 'thumb';
			} else {
				$('project_footer').descendants()[0].className = 'hidden';
			}
			if (p[0].image2.length > 0) {
				img = new Image();
				img.src = p[0].image2;
				$('project_footer').descendants()[1].src = p[0].image2;		
				$('project_footer').descendants()[1].onclick = function() { LoadImage(1); }
				$('project_footer').descendants()[1].className = 'thumb';
			} else {
				$('project_footer').descendants()[1].className = 'hidden';
			}
			if (p[0].image3.length > 0) {
				img = new Image();
				img.src = p[0].image3;
				$('project_footer').descendants()[2].src = p[0].image3;
				$('project_footer').descendants()[2].onclick = function() { LoadImage(2); }
				$('project_footer').descendants()[2].className = 'thumb';
			} else {
				$('project_footer').descendants()[2].className = 'hidden';
			}
			if (p[0].image4.length > 0) {
				img = new Image();
				img.src = p[0].image4;
				$('project_footer').descendants()[3].src = p[0].image4;
				$('project_footer').descendants()[3].onclick = function() { LoadImage(3); }
				$('project_footer').descendants()[3].className = 'thumb';
			} else {
				$('project_footer').descendants()[3].className = 'hidden';
			}
			if (p[0].image5.length > 0) {
				img = new Image();
				img.src = p[0].image5;
				$('project_footer').descendants()[4].src = p[0].image5;
				$('project_footer').descendants()[4].onclick = function() { LoadImage(4); }
				$('project_footer').descendants()[4].className = 'thumb';
			} else {
				$('project_footer').descendants()[4].className = 'hidden';
			}
			// hide desc if visible
			if (desc_up) {
				$('project_body').descendants()[0].hide();
				//$('project_body').descendants()[0].visualEffect('fade',{duration:.5,beforeStart:starting, afterFinish:finished});
				desc_up = false;
			}		
			if (p[0].image1.length > 0) {
				LoadImage(0);				
			} else {
				$('project_body').setStyle('background-image: none');			
			}
			return true;
		}
	}
	return false;
}

function ShowUp(top) {
	return top < scroll_button_height;
}

function ShowDown(top, sh) {
	return top > scroll_button_height - sh + max_scroll_height - (scroll_button_height * 2);
}

function GetNewTop(oldtop, up, list) {
	// note - we fail if a project title is bigger than the entire size (shouldn't happen) because i-1 would be -1
	var new_top = oldtop;
	var i = 0;
	
	var window = max_scroll_height - (scroll_button_height * 2);
	var ceiling = scroll_button_height;
	var floor = ceiling - list.scrollHeight + window;
	
	if (up) {
		if (oldtop + window > ceiling) {
			new_top = ceiling;
		} else {
			while (new_top < oldtop + window && i < list.childElements().length) {
				new_top += list.childElements()[i].scrollHeight + 2;
				i++;
			}
			new_top -= list.childElements()[i-1].scrollHeight + 2;	
		}
	} else {
		if (oldtop - window < floor) {
			new_top = floor;
		} else {
			while (new_top > oldtop - window && i < list.childElements().length) {
				new_top -= list.childElements()[i].scrollHeight + 2;
				i++;
			}
			new_top += list.childElements()[i-1].scrollHeight + 2;
		}
	}
	return new_top;
}

function LoadImage(index) {
	if (index > -1 && index < 5) {
		if ($('project_footer').descendants()[0].className != 'hidden') {
			$('project_footer').descendants()[0].className = "thumb";	
		}
		if ($('project_footer').descendants()[1].className != 'hidden') {
			$('project_footer').descendants()[1].className = "thumb";
		}
		if ($('project_footer').descendants()[2].className != 'hidden') {
			$('project_footer').descendants()[2].className = "thumb";
		}
		if ($('project_footer').descendants()[3].className != 'hidden') {
			$('project_footer').descendants()[3].className = "thumb";
		}
		if ($('project_footer').descendants()[4].className != 'hidden') {
			$('project_footer').descendants()[4].className = "thumb";
		}
		$('project_footer').descendants()[index].className = 'thumb current';	
		var newStyle = $('project_footer').descendants()[index].src;
		$('project_body').setStyle('background-image: url('+newStyle+')');		
		if (desc_up) {			
			$('project_body').descendants()[0].visualEffect('fade',{duration:.5,beforeStart:starting, afterFinish:finished});
			desc_up = false;
		}
	}
}

// home page project preview

var prevWait;
var prevGo;
var prevCurrentService;
var hp_semaphore = 0;
// semaphore is only to prevent a service from changing while a change is still in progress.  we aren't running anything very parallel here, but we do want to wait for certain events to finish before we start others.

function ProjectPreview(eng, plan, la, ls, env) {
	//if (eng.title && plan.title && la.title && ls.title && env.title) {
		var textList = $('services');	
		this.services = [];
				
		this.services[0] = eng[Math.floor(Math.random() * eng.length)];
		this.services[1] = plan[Math.floor(Math.random() * plan.length)];
		this.services[2] = la[Math.floor(Math.random() * la.length)];
		this.services[3] = ls[Math.floor(Math.random() * ls.length)];
		this.services[4] = env[Math.floor(Math.random() * env.length)];
		
		//this.services[0].service = 'Engineering';
		//this.services[1].service = 'Planning';
		//this.services[2].service = 'Landscape Architecture';
		//this.services[3].service = 'Land Surveying';
		//this.services[4].service = 'Environmental Services';
		
		for (var i = 0; i < 5; i++) {
			AddListClick(textList.childElements()[i], this, i);
		}
		
		$('eng_img').src = this.services[0].image.src;
		$('plan_img').src = this.services[1].image.src;
		$('la_img').src = this.services[2].image.src;
		$('ls_img').src = this.services[3].image.src;
		$('env_img').src = this.services[4].image.src;
		
		DelayStart(this);
	//}
}

function AddListClick(listItem, pp, index) {
	listItem.onclick = function() {
		if (hp_semaphore == 0) {
			hp_semaphore++;
			// locked
				pp.stop();
				$$('li.current').each(function(s) {
					s.className = "";
				});
				listItem.className = "current";
						
				$('service_title').innerHTML = pp.services[index].service;
				$('project_title').innerHTML = pp.services[index].title;
				$('project_location').innerHTML = pp.services[index].location;	
				$('more_projects').firstDescendant().href = pp.services[index].link;			
				ChangeListImage((index - prevCurrentService + 5) % 5);
				ChangeBigImage(pp.services[index].image.src, pp.services[index].link);
				
				prevCurrentService = (index + 1) % 5;
				prevGo = setInterval(function() {	
					NextProject(pp);
				}, 5000);
			// unlocked
			hp_semaphore--;
		}
	};
}

ProjectPreview.prototype.ready = function() {
	return (this.services[0].image.complete && this.services[1].image.complete && this.services[2].image.complete && this.services[3].image.complete && this.services[4].image.complete);
};

ProjectPreview.prototype.start = function() {
	var prev = this;	
	prevCurrentService = 0;
	NextProject(prev);
	prevGo = setInterval(function() {	
		NextProject(prev);
	}, 5000);	
};

function NextProject(p) {
	/* handle animation and text changes for a project change: */
	hp_semaphore++;
	// locked
		var textList = $('services');	
		//	change out the text below
		$('service_title').innerHTML = p.services[prevCurrentService].service;
		$('project_title').innerHTML = p.services[prevCurrentService].title;
		$('project_location').innerHTML = p.services[prevCurrentService].location;	
		//	change out the current item in the right side services list
		textList.childElements()[prevCurrentService].className = "current";
		textList.childElements()[(prevCurrentService + 4) % 5].className = "";
		//	change the event on the more click
		$('more_projects').firstDescendant().href = p.services[prevCurrentService].link;
		//	start the list animation
		ChangeListImage(0);
		//	fade out the big image	
		ChangeBigImage(p.services[prevCurrentService].image.src, p.services[prevCurrentService].link);
		prevCurrentService = (++prevCurrentService) % 5;
	// unlocked
	hp_semaphore--;
}

function ChangeListImage(nextImageIndex) {
	// change from the current list image to the next image index
	var imageList = $('service_mask').firstDescendant()
	for (var i = 0; i <= nextImageIndex; i++) {
		imageList.insert({bottom: '<li>' + imageList.childElements()[i].innerHTML + '</li>' });
		Effect.BlindUp(imageList.childElements()[i],{duration:1,beforeStart: function() {
			// get a lock
			hp_semaphore++;			
		},afterFinish:function() {
			// note, we're always removing the first item from the list here, but we're going to do it once for every item we blind up.
			$('service_mask').firstDescendant().firstDescendant().remove();
			// lose a lock
			hp_semaphore--;
		}});
	}
}

function ChangeBigImage(newBigImage,link) {
	Effect.Fade($('big_img'),{duration:.5,beforeStart: function() {
		// get a lock
		hp_semaphore++;
	},afterFinish:function() {
		$('big_img').src = newBigImage;
		$('big_img').onclick = function () {
			window.location = link;
		}; 
		Effect.Appear($('big_img'),{duration:.5,beforeStart: function() {
			// get a lock
			hp_semaphore++;
		},afterFinish: function() {
			// lose a lock
			hp_semaphore--;
		}});
		// lose a lock
		hp_semaphore--;
	}});
}

ProjectPreview.prototype.stop = function() {
	// stop everything
	clearInterval(prevGo);
};

function DelayStart(prev) {	
	if(!prev.ready()){
		prevWait=setTimeout(function() {DelayStart(prev);}, 250);
	}
	else{
		Effect.Fade($('loading'),{duration:1});
		prev.start();
		return true;
	}
}

function PrevProj(name, loc, img, url, service) {
	var f = function() {clearTimeout(prevWait); alert('Error loading image'); };

	this.image = new Image();
	this.image.src = img;
	this.image.onabort = f;
	this.image.onerror = f;
	this.title = name;
	this.location = loc;
	this.link = url;
	this.service = service
}

// gallery

var width = 657;
var rows = 2;
var viewable = 4;

var lastTarget = 0;

var squares_per_row;
var total_width;
var one_arrow_width;
var intervalid = -1;
var speed = 20; // lower is faster

function scroll_init() {
	var total = $('gal').childElements()[0].childElements().length;
	if (total > rows * viewable) {
		squares_per_row = Math.ceil(total / rows);
	} else {
		squares_per_row = viewable;
	}
	total_width = squares_per_row * (width / viewable);
	$('gal').childElements()[0].setStyle('width:' + total_width + 'px;');
	one_arrow_width = width;	
	scroller = new SmoothMovement(0, 0);					
	check_arrows();
}

function scroll_left() {
	if ($('scroll_left').className != 'hidden') {
	    if (intervalid != -1){
	        if (!scroller.hasStopped()) {
	            return;
	        }	    
	    }	
	    window.clearInterval(intervalid);	    
	    lastTarget += one_arrow_width;
	    check_arrows();	
	    scroller.changeTarget(lastTarget);
	    intervalid = window.setInterval(update_scroll, speed);
	}
}

function update_scroll() {
	$('gal').childElements()[0].setStyle('left:' + scroller.updatePosition() + 'px;');
}

function scroll_right() {
	if ($('scroll_right').className != 'hidden') {
	    if (intervalid != -1){
	        if (!scroller.hasStopped()) {
	            return;
	        }	    
	    }	
	    window.clearInterval(intervalid);
		lastTarget -= one_arrow_width;
		check_arrows();
	    scroller.changeTarget(lastTarget);
	    intervalid = window.setInterval(update_scroll, speed);
	}
}
		
function check_arrows() {
	if (lastTarget >= 0) {
		$('scroll_left').className = 'hidden';
	} else {
		if ($('scroll_left').className == 'hidden') $('scroll_left').className = '';
	}
	
	if (lastTarget > 0 - (total_width - width)) {
		if ($('scroll_right').className == 'hidden') $('scroll_right').className = '';
	} else {
		$('scroll_right').className = 'hidden';
	}	
}		
