/*fancy select/option boxes object*/
function FancySelect(selectElm,opts) {
	var _this = this;
		
	this.__construct = function(opts) {
		this.opts = opts
		this.sElm = selectElm
		var size = (this.opts.size) ? this.opts.size : 100;
		var img = (this.opts.img) ? this.opts.img : false;
		var inputTarget = ($("#" + this.opts.inputTarget).length > 0) ? $("#" + this.opts.inputTarget) : false;
		this.sInputBox = document.createElement('div');
		this.sInputSpan = document.createElement('span');
		this.sInput = document.createElement('input');
		this.sOptionsBox = document.createElement('div');
		this.sOpen = document.createElement('a');
	
		$(this.sInput).attr({
			name:selectElm.attr("name"),
			type:'text',
			size: size,
			readonly:'readonly'
		});
		
		$(this.sInput).addClass("fancy-input");
		
		$(this.sOpen).addClass('select-open');
		
		$(this.sInputBox).attr({
			//id:this.generateRandomId("input-group-")
			id:"input-group-" + this.sElm.parent().attr("id")
		});
		
		$(this.sInputBox).addClass("input-group");

		$(this.sOptionsBox).attr({
			//id:this.generateRandomId("options-group-")
			id:"options-group-" + this.sElm.parent().attr("id")
			
		});

		
		$(this.sOptionsBox).css({
			//display: 'none'
			display: "none"
		});
		
		if(!img) {
			$(this.sOpen).text("open");
			$(this.sOpen).attr({
				href:'#',
				title:'open list'
			});
		} else {
			var nImg = document.createElement('img');
			$(nImg).attr({
				src:img
			});
			$(this.sOpen).append(nImg);
			$(this.sOpen).attr({
				href:'#',
				title:'open list'
			});
		}

		
		$(this.sOpen).addClass('select-open');

		$("body").append(this.sOptionsBox);
				
		//insert the input element into the parent of the original select\
		$(this.sInputBox).append(this.sOpen);
		$(this.sInputSpan).append(this.sInput);
		$(this.sInputBox).append(this.sInputSpan);
		if(!inputTarget) {
			this.sElm.parent().append(this.sInputBox);
		} else {
			inputTarget.append(this.sInputBox);
		}
		
		//give the input box absolute positioning according
		//to the replaced elements
		
		$(this.sInputBox).css({
			//position:'absolute'
			//top:Math.round(this.sElm.parent().position().top + 10),
			//left:Math.round(this.sElm.parent().position().left)
		});
		
		
		this.sElm.hide();
		//this.sElm.css({visibility:"hidden"});

		
		$("option",this.sElm).each(function(i){
			if(i == 0 || $(this).attr("selected")) {
				$(_this.sInput).attr({
					value:$(this).text()
					});
			}
			var sItem = document.createElement('div');
			$(sItem).addClass('option-item');
			var sPad = document.createElement('span');
			var sLink = document.createElement('a');
			$(sLink).text($(this).text());
			$(sLink).attr({
				href: '#' + $(this).attr("value")
			});
			//add hover listen to link
			$(sLink).hover(
				//over
				function() {
					$(this).addClass('select-over');
				},
				//off
				function() {
					$(this).removeClass('select-over');
				}
			);
			
			$(sLink).click(_this.onItemClick);
			$(sPad).html(sLink);
			$(sItem).html(sPad);
			$(_this.sOptionsBox).append($(sItem));
		});
		
		$(this.sOpen).click(_this.onSelectOpen);
	}
	
	this.onSelectHover = function() {
		//alert(this);
	}
	
	this.onSelectOpen = function(e) {
		e.preventDefault();
		if($(_this.sOptionsBox).hasClass('open')) {
			$(_this.sOptionsBox).hide();
			$(_this.sOptionsBox).removeClass('open');
		} else {
			//give the options absolute position in relation to
			//the new InputBox
			$(_this.sOptionsBox).addClass('options-group');
			$(_this.sOptionsBox).css({
				position:'absolute',
				top:Math.round($(_this.sInputBox).offset().top + $(_this.sInputBox).height()),
				left:Math.round($(_this.sInputBox).offset().left)
			});
			$(_this.sOptionsBox).show();
			$(_this.sOptionsBox).addClass('open');
		}
	}
	
	this.onItemClick = function(e) {
		$(_this.sInput).attr({
			value:$(this).text()
			});
		_this.onSelectOpen(e);
		
		//finally change the value of the original select
		var crappyOldOnChange = _this.sElm.attr("onchange");
		_this.sElm.attr({value: $(this).attr("href").split("#")[1]});
		crappyOldOnChange();
		
	}
	
	this.generateRandomId = function(id) {
		var i = 10;
		var boxString = id;
		for(var j=0; j < i; j++) {
			boxString += String.fromCharCode(97 + Math.round(Math.random() * 25));
		}
		return boxString
	}
	
	
	this.__construct(opts);
	return this;
}


/*main nvp object*/
var nvpInit = function(options){
	
	var _this = this;
	
	
	this.__construct = function(options) {
			this.sifr = options.sifr;
	}
	
	this.init = function() {
		//init sifr replacement
		this.sifrInit(this.sifr);

		if(this.elementExists("div.data_table","div#content")) {
			var table = $("#" + $("div.data_table").attr("id"));
			if(table.hasClass("fancy")) {
				this.tableHilite(table);
			}
		}

		
		//tabs
		if(this.elementExists(".tabs-container","div#content")) {
			var tabBox = $("div.tabs-container");
			//prepare for multiple tab boxes on page?
			//var tabBox = $("#" + $("div.tab-container").attr("id"));
			this.initTabs(tabBox);
		}
		
		if(this.elementExists(".varsize","div#content")) {
			$(".varsize","div#content").each(function(i){
				_this.initResizable($(this));
			});
			
		}
		
		//fancy select boxes
		if(this.elementExists("select","#filters")) {
			var selectElms = $("#filters select");
			var fSboxes = new Array();
			selectElms.each(function(i){
				if($(this).hasClass("fancy")) {
					var opts = {
						};
					fSboxes[i] = new FancySelect($(this),opts);
				}
			});
		}
	}
	
	this.sifrInit = function(sifr) {
		var debug = sifr.debug;
		for(sel in sifr.selectors) {
			var s = sifr.selectors[sel];
			var font = sifr.fonts[s.font];
			var color = "color: " + sifr.colors[s.color] + ";";
			var css = font.baseCss;
			css += color;
			//construct sifr load statement
			if(s.css != 'undefined' && typeof s.css == 'string') {
				css += s.css;
			}
			
			var sifrOptions = {
				selector:sel,
				css:'.sIFR-root { ' + css + '}',
				wmode:'transparent'
			}
			
			if(s.extra != 'undefined' && typeof s.extra == 'object') {
				$.extend(sifrOptions,s.extra);
			}

			sIFR.replace(font,sifrOptions);
			if(debug == true) {
				sIFR.debug.ratios(font,sifrOptions);
			}
		}
	}

	this.tableHilite = function(table){
		$("div.unit",table).hover(
				function() {
					$(this).addClass('hover');
				},
				function() {
					$(this).removeClass('hover');
				}
		)
		//due to problems with ie z-index bug
		$("div.unit",table).each(function(){
			var myLink = $("a",this);
			$(this).click(function(e){
					window.location = myLink.attr("href");
					return false;
			});	
		});
	}
	
	
	this.initTabs = function(tabBox) {
		$(".tabctl",tabBox).each(function() {
			var lnk = $("a",this);
			$(lnk).click(_this.clickTab);
		});
	}
	
	this.flashClickTab = function(ctlLnk,on,off) {
		var lnk = ctlLnk;
		//if this object is an a continue
		//else extract the link information
		var ctl = lnk.parents(".tabctl");
		if(ctl.hasClass("taboff")) {
			//clear all tabs in parent tab-container
			tabBox = lnk.parents("div.tabs-container");
			_this.clearTabs(tabBox);
			ctl.removeClass("taboff");
			$(lnk.attr("href")).removeClass("taboff");
			
			//recolor the flash movie
			for(var i = 0; i < sIFR.replacements.length; i++){
				var jobj = jQuery(sIFR.replacements[i].getAncestor());
				//tab control parent exists
				if(jobj.parents(".tabctl").length > 0) {
					if(jobj.parents(".tabctl").hasClass("taboff")) {
						sIFR.replacements[i].changeCSS(".sIFR-root { color: " + off + "; }");
					} else {
						sIFR.replacements[i].changeCSS(".sIFR-root { color: " + on + "; }");
					}

				}
			}
		} else {
		}
	}
	
	this.clickTab = function(e) {
		e.preventDefault();;
		var lnk = $(e.target);
		//if this object is an a continue 
		//else extract the link information
		var ctl = lnk.parents(".tabctl");
		if(ctl.hasClass("taboff")) {
			//clear all tabs in parent tab-container
			tabBox = lnk.parents("div.tabs-container");
			_this.clearTabs(tabBox);
			ctl.removeClass("taboff");
			$(lnk.attr("href")).removeClass("taboff");
		} else {
			return
		}
	}
	
	this.clearTabs = function(tabBox) {
		$(".tabctl",tabBox).each(function() {
			$(this).addClass("taboff");
		});
		$(".tab",tabBox).each(function() {
			$(this).addClass("taboff");
		});
	}
	
	this.initResizable = function(reSize) {
		//find fold if it exists, if not return
		if(this.elementExists("#fold",reSize)) {
			reSize.parent().css({overflow:"hidden"});
			//test all itmes, 
			//if they are 'below the fold' 
			//include them in the fold
			//element
			var foldTest = false;
			var foldParas = reSize.children().filter(function(i){
				if($(this).attr("id") == "fold") {
					foldTest = true;
				}
				if(foldTest == true) {
					return true;
				} else {
					return false;
				}
			})

			
			//create the container
			var foldCont = document.createElement('div');
			var foldCont = $(foldCont);
			foldCont.attr({'id':reSize.attr("id") + "-fold"});
			foldParas.each(function() {
				foldCont.append(this);
			});
			reSize.append(foldCont);


			realHeight = foldCont.height();
			foldCont.height(0);
			foldCont.hide();

			
			//create a control link and give it some attributes
			var ctlLink = document.createElement('a');
			var ctlSpan = document.createElement('span');
			var ctlLink = $(ctlLink);
			var ctlSpan = $(ctlSpan);
			ctlLink.attr({
				href: "#"
			})
			ctlLink.addClass("read_full_" + reSize.attr("id"));
			ctlLink.addClass("varsizectl");
			ctlSpan.addClass("plus_me");
			ctlLink.text("read full " + reSize.attr("id"));
			$(ctlSpan).html(ctlLink);
			reSize.parent().append(ctlSpan);
			
			//custom hover
			ctlLink.hover(
				function(){
				     $(this).css({borderBottom: "solid 1px #c0d0df"});
					},
				function(){
					$(this).css({borderBottom: "none"});
					}
			);
			
			//finally attach the listeners
			ctlLink.click(function(e) {
				e.preventDefault();
				_this.actionResizable($(this),foldCont,reSize.attr("id"),realHeight);
			});
		} else {
			return;
		}
	}
	
	this.actionResizable = function(ctlLink,foldCont,label,realHeight) {
		if(ctlLink.hasClass("open")) {
			ctlLink.removeClass("open");
			foldCont.animate({
				height:0
			},1200,"linear",function(){
				foldCont.hide();
				ctlLink.text("read full " +  label);
				ctlLink.css({borderBottom: "none"});
				ctlLink.css({backgroundImage: "none"});
			});


		} else {
			ctlLink.css({borderBottom: "none"});
			ctlLink.addClass("open");
			foldCont.show();
			foldCont.animate({
				height: realHeight
			},1200,"linear",function(){
				ctlLink.text("collapse " +  label);
				ctlLink.css({borderBottom: "none"});
				ctlLink.css({backgroundImage: "none"});
			});
		}
	}

	
	this.elementExists = function(sel,context) {
		if($(sel,context).length > 0) {
			return true;
		} else {
			return null;
		}
	}
	
	this.__construct(options);
	return this;
}




//portfolio resize function

function resizePage(currentHeight){
	var portfolio = $("#nvp_portfolio");
	portfolio.height(currentHeight);
}





var opts = {
	sifr : {
		debug: false,
		fonts:{
			book:{
				src:'/flash/gotham_book.swf',
				baseCss:' background-color: transparent; leading: 6.0;',
				ratios:[8, 1.3, 9, 1.22, 10, 1.25, 11, 1.22, 12, 1.2, 18, 1.19, 21, 1.15, 28, 1.16, 30, 1.15, 40, 1.14, 59, 1.13, 95, 1.12, 96, 1.11, 103, 1.12, 105, 1.11, 108, 1.12, 110, 1.11, 111, 1.12, 115, 1.11, 117, 1.12, 124, 1.11, 1.12]
				},
			bold:{
				src:'/flash/gotham_bold.swf',
				baseCss:'background-color: transparent; text-transform: uppercase; leading: 1.0;',
				ratios:[9, 1.27, 14, 1.19, 15, 1.16, 23, 1.15, 26, 1.12, 27, 1.13, 30, 1.12, 43, 1.11, 58, 1.1, 59, 1.09, 60, 1.1, 65, 1.09, 67, 1.1, 116, 1.09, 118, 1.08, 1.09]
				}
			},
		colors:{
			black:'#ffffff',
			blue:'#456d9b',
			dkblue:'#003876',
			brown:'#a08948',
			gray:'#666666'
			},
		selectors:{
			'h1.frep':{font:'bold',color:'blue',extra:{tuneHeight:-7}},
			'h2.frep':{font:'bold',color:'dkblue',
				css:'text-transform:normal'
			},
			'h2.companyname':{font:'bold',color:'brown',
				css:'text-transform:normal'
			},
			'#about_sum h3.frep':{font:'bold',color:'dkblue'},
			'.tabon .frep':{font:'bold',color:'brown'},
			'.co_brown h3.frep':{font:'bold',color:'brown'},
			'h3.frep':{font:'bold',color:'brown'},
			'p.frep':{font:'book',color:'dkblue'},
			'#about_sum .frep p':{font:'book',color:'brown'},
			'.tabs-container .tabs-mast .taboff span.frep':{
				font:'bold',
				color:'brown',
				extra:{
					modifyContent: function(c,s){
						$(c).html($("a",c).attr("title"));
						},
					onRelease: function(fi){
						var span = $(fi.getAncestor());
						var lnk = $("a",span);
						var onColor = opts.sifr.colors.gray;
						var offColor = opts.sifr.colors.brown
						nvp.flashClickTab(lnk,onColor,offColor);
						}		
					}
				},
			 '.tabs-container .tabs-mast span.frep':{
				 font:'bold',
				 color:'gray',
				 extra: {
					modifyContent: function(c,s){
						$(c).html($("a",c).attr("title"));
						},
					onRelease: function(fi){
						var span = $(fi.getAncestor());
						var lnk = $("a",span);
						var onColor = opts.sifr.colors.gray;
						var offColor = opts.sifr.colors.brown
						nvp.flashClickTab(lnk,onColor,offColor);
						}		
					}
				 }		
			}
		}	
	}

//activate seems to need to happen before the dom is ready	
if(typeof sIFR == 'object') {
	sIFR.fitExactly = true;
	sIFR.activate(opts.sifr.fonts.book,opts.sifr.fonts.bold);
}



$(document).ready(function() {
	
	//to prevent the flash movie from taking over the home page
	/*
	if($.browser.msie && $("#hero_header").length > 0) {
		$("li","ul.nav").each(function(){
			var lnk = $("a",this);
			lnk.click(function(e){
				e.preventDefault();
				var loc = $(this).attr("href");
				window.open(loc,'_self');
				//nLoc = "http://www.google.com";
				//window.location.href = loc;
			});	
		});	
	}
	*/
	
	//load portfolio flash
	if($("div#nvp_portfolio").length > 0) {
		var flashVars = {
			};
		var params = {
			quality:'high',
			wmode:'transparent',
			bgcolor:'#ffffff'
			};
		var attributes = {};
		
		function callBack(e) {
			if(e.success != true) {
				return;
			} 
		}
		
		swfobject.embedSWF(
			'/flash/folio/NVP.swf',
			'nvp_portfolio',
			'960',
			'750',
			'9.0.28',
			'',
			flashVars,
			params,
			attributes,
			callBack
		);
	}
	
	//initialize and load nvp object
	nvp = new nvpInit(opts);
	nvp.init();

});
	
	

/* Utility functions
----------------------------------------------------------------------------- */
function openWin(url, name, features) {
    if (!url) url = location.href;
    if (!name) name = 'window';
    if (!features) features = 'width=800,height=600,resizeable=1,scrollbars=1';

    var win = window.open(url, name, features);
    if (win.focus) win.focus();
}


