IP.client = {
	about : {
		Careers : Ext.extend(IP.web.page.CategorizedList, {
			buildNavLevels : function(box) {
				this.detailTitle = 'Career Opportunity';
				this.buildNavItem(box.content, 'View All', 'All Careers', [], true);
				if (this.ds.getCount() > 1) {
					var categories = this.ds.collect('category');
					Ext.each(categories, function(category) {
						this.buildNavItem(box.content, category, category + ' Careers', [
							{
								field : 'category',
								value : category
							}
						], false);
					}, this);
				}
			},
			createListItem : function(r, box, layer) {
			
				//*** define element
				var el = box.content.insertHtml('beforeEnd', String.format('<div><div></div><div><span style="display:block;padding:0 0 4px 0;font-size:18px;line-height:.75em;color:' + this.config.hiliteColor + ';">{0}</span><b>Category:</b> {1}</div></div>', r.get('position'), r.get('category')), true);
				
				//*** define layer
				var temp = '<div><div style="display:block;padding:0 0 5px 0;font-size:18px;font-weight:normal;">' + r.get('position') + '</div><div style="display:block;padding:0 0 0 0;"><b>Category:</b> ' + r.get('category') + '</div>';
				if (!r.get('description').empty()) temp += '<div style="display:block;margin:10px 0 0 0;border-top:1px solid #9fa7b4;padding:10px 0 0 0;">' + r.get('description') + '</div>';		
				temp += '</div>';		
				layer.update(temp);
				
				//*** add to print
				temp = '<p style="margin:0 0 25px 0"><b>' + r.get('position') + '</b><br /><b>Category:</b> ' + r.get('category');
				if (!r.get('description').empty()) temp += '<br />' + r.get('description');
				IP.Print.add(temp);
				
				this.buildListItem(r, el, layer);
			},
			showForm : function(r) {
				var mask = $('wrapper').insertHtml('beforeEnd', '<div></div>', true);
				mask.setStyle({
					'position' : 'absolute',
					'left' : '0',
					'top' : '0',
					'background-color' : '#000000',
					'z-index' : '9000'
				});
				mask.setSize($('wrapper').getWidth()-$('wrapper').getBorderWidth('lr'), $('wrapper').getHeight()-$('wrapper').getBorderWidth('tb'));
				mask.setOpacity(.75);
				mask.show();
				var layer = $('wrapper').insertHtml('beforeEnd', '<div></div>', true);
				layer.setStyle({
					'position' : 'absolute',
					'background-color' : '#FFFFFF',
					'border' : '3px solid #999999',
					'width' : '750px',
					'height' : '600px',
					'color' : '#333333',
					'font-family' : 'arial',
					'font-size' : '12px',
					'line-height' : '1.5em',
					'z-index' : '9001'
				});
				layer.setXY([(($('wrapper').getWidth()-$('wrapper').getBorderWidth('lr'))/2)-(layer.getWidth()/2) + $('wrapper').getX(),(($('wrapper').getHeight()-$('wrapper').getBorderWidth('tb'))/2)-(layer.getHeight()/2) + $('wrapper').getY()]);
							
				var title = layer.insertHtml('beforeEnd', '<div>Apply Now</div>', true);
				title.unselectable();;
				title.setStyle({
					'position' : 'absolute',
					'left' : '0',
					'top' : '0',
					'width' : '700px',
					'height' : '25px',
					'padding' : '13px 25px 7px 25px',
					'font-size' : '24px',
					'line-height' : '.75em',
					'background-color' : this.config.hiliteColor,
					'color' : '#FFFFFF'
				});
				
				
				var alertWrapper = layer.insertHtml('beforeEnd', '<div id="x-apply-alert"></div>', true);
				alertWrapper.setStyle({
					'position' : 'absolute',
					'left' : '0',
					'top' : '45px',
					'width' : '100%'
				});
				
				
				layer.insertHtml('beforeEnd', '<div><div id="x-apply-desc"></div><div id="x-apply"><form name="x-apply-form"><fieldset><input type="text" name="fname" /><input type="text" name="lname" /><input type="text" name="phone" /><input type="text" name="email" /><textarea name="notes"></textarea><input type="file" name="resume" /><input type="text" name="captcha" /></fieldset></form></div></div>');
				
				var desc = $('x-apply-desc');
				var apply = $('x-apply');
				desc.setStyle({
					'position' : 'absolute',
					'left' : '350px',
					'top' : '75px',
					'width' : '375px',
					'height' : '500px'
				});
				apply.setStyle({
					'position' : 'absolute',
					'left' : '25px',
					'top' : '75px',
					'width' : '300px',
					'height' : '500px',
					'overflow' : 'hidden'
				});
				
				desc.insertHtml('beforeEnd', '<div style="display:block;padding:0 0 10px 0;font-size:18px;line-height:1.25em;color:' + this.config.hiliteColor + ';">' + r.get('position') + '</div>', true);
				
				
				desc.insertHtml('beforeEnd', '<div style="display:block;">' + (!r.get('description').empty() ? r.get('description') : 'NO DESCRIPTION') + '</div>', true);
								

				var form = new IP.page.Form({
					name : 'x-apply-form',
					action : '/',
					method : 'POST',
					onsubmit : false
				});
				form.createInput({
					name : 'code',
					type: 'hidden',
					value : r.get('code')
				}, 'x-apply-form', 'afterBegin');
				form.createInput({
					name : 'position',
					type: 'hidden',
					value : r.get('position')
				}, 'code', 'afterEnd');
				form.setInput({
					name : 'fname', 
					type : 'text',
					label : 'First Name',
					tabindex : 1,
					value : '',
					maxlength : 50,
					cls : ['input', 'text'],
					style : {'width' : '288px'},
					validation : {
						text : 'Please enter your first name.'
					}
				});
				form.setInput({
					name : 'lname', 
					type : 'text',
					label : 'Last Name',
					tabindex : 1,
					value : '',
					maxlength : 50,
					cls : ['input', 'text'],
					style : {'width' : '288px'},
					validation : {
						text : 'Please enter your last name.'
					}
				});
				form.setInput({
					name : 'phone', 
					type : 'text',
					label : 'Phone Number',
					value : '',
					tabindex : 1,
					maxlength : 50,
					cls : ['input', 'text'],
					style : {'width' : '288px'},
					validation : {
						text : 'Please enter a valid phone number.',
						type : 'phone'
					}
				});
				form.setInput({
					name : 'email', 
					type : 'text',
					label : 'Email Address',
					value : '',
					tabindex : 1,
					maxlength : 100,
					cls : ['input', 'text'],
					style : {'width' : '288px'},
					validation : {
						text : 'Please enter a valid email address.',
						type : 'email'
					}
				});
				form.setInput({
					name : 'notes',
					type : 'textarea',
					label : 'Notes (optional)',
					value : '',
					tabindex : 1,
					maxlength : 500,
					cls : 'textarea',
					style : {'width' : '288px', 'height' : '75px'},
					validation : {
						disabled : true
					}
				});
				form.setInput({
					name : 'resume', 
					type : 'file',
					label : 'Attach Resume',
					value : '',
					tabindex : -1,
					validation : {
						text : 'Please attach your resume.'
					}
				});
				form.setInput({
					name : 'captcha', 
					type : 'text',
					label : 'Enter Security Code',
					value : '',
					tabindex : 1,
					maxlength : 6,
					cls : ['input', 'text'],
					style : {'width' : '150px'},
					validation : {
						text : 'Please enter the security code.',
						type : 'phone'
					}
				});
				form.setAttributes();
				form.setLabels();				
				var resume = form.getInput('resume');
				var resumeWrapper = resume.wrap().setStyle({
					'position' : 'relative',
					'width' : '300px',
					'overflow' : 'hidden'
				});
				resume.setStyle({
					'position' : 'absolute',
					'top' : '0',
					'left' : (resume.up('div').getWidth() - resume.getWidth()).toString() + 'px',
					'cursor' : 'pointer',
					'z-index' : '20'
				});
				resume.setOpacity(0);
				resume.on({
					'change' : function(e, t) {
						resumeInput.setValue($(t).getValue().substr($(t).getValue().lastIndexOf('\\')+1));
					}
				});
				
				var attach = resumeWrapper.insertHtml('beforeEnd', '<div>Browse</div>', true);
				attach.setStyle({
					'position' : 'absolute',
					'top' : '0',
					'width' : '62px',
					'left' : (resumeWrapper.getWidth() - 70).toString() + 'px',
					'padding' : '5px 3px',
					'border' : '1px solid #CCCCCC',
					'background-color' : '#CCCCCC',
					'color' : '#333333',
					'line-height' : 'normal',
					'text-align' : 'center',
					'cursor' : 'pointer',
					'z-index' : '10'
				});
				attach.unselectable();

				var resumeInput = resumeWrapper.insertHtml('beforeEnd', '<input disabled />', true);
				resumeInput.setStyle({
					'position' : 'absolute',
					'left' : '0',
					'top' : '0',
					'width' : (resumeWrapper.getWidth() - attach.getWidth() - 12).toString() + 'px',
					'height' : (attach.getHeight() - 10).toString() + 'px',					
					'padding' : '4px 5px 4px 5px',
					'background-color' : '#ffffff',
					'border': 'solid 1px #CCCCCC',
					'font' : '12px arial, sans-serif',
					'font-weight' : 'normal',
					'line-height' : 'normal',
					'color' : '#666666',
					'z-index' : '25'
				});
				resumeWrapper.setStyle({
					'height' : attach.getHeight().toString() + 'px',
					'margin' : '0 0 7px 0'
				});
				var captcha = form.getInput('captcha');
				var captchaImage = captcha.insertHtml('beforeBegin', '<img src="' + this.config.root + 'lib/aspx/captcha.aspx?id=' + form.crypt(Ext.id()) + '" class="captcha" />', true);
				
				var listeners = {
					'mouseover' : {
						fn : function(e, t) {
							e.preventDefault();
							$(t).setStyle({
								'border' : '1px solid ' + this.config.hiliteColor,
								'background-color' : '#FFFFFF',
								'color' : this.config.hiliteColor
							});
						},
						scope : this
					},
					'mouseout' : {
						fn : function(e, t) {
							e.preventDefault();
							$(t).setStyle({
								'border' : '1px solid #FFFFFF',
								'background-color' : this.config.hiliteColor,
								'color' : '#FFFFFF'
							});
						},
						scope : this
					}
				};
				var style = {
					'position' : 'absolute',
					'width' : '75px',
					'padding' : '5px 3px',
					'border' : '1px solid ' + this.config.hiliteColor,
					'background-color' : this.config.hiliteColor,
					'color' : '#FFFFFF',
					'line-height' : 'normal',
					'text-align' : 'center',
					'cursor' : 'pointer'
				};
				var buttons = $('x-apply').insertHtml('beforeEnd', '<div></div>', true);
				buttons.setStyle({
					'position' : 'relative'
				});
				var button = buttons.insertHtml('beforeEnd', '<div>Cancel</div>', true);
				button.setStyle(style);
				button.setStyle('left', '0');
				button.unselectable();
				button.on(listeners);
				button.on({					
					'click' : {
						fn : function(e, t) {
							e.preventDefault();
							layer.remove();
							mask.remove();
						},
						scope : this
					}
				}),
				button = buttons.insertHtml('beforeEnd', '<div>Submit</div>', true);
				button.setStyle(style);
				button.setStyle('left', '95px');
				button.unselectable();
				button.on(listeners);
				button.on({					
					'click' : {
						fn : function(e, t) {
							e.preventDefault();
							this.validateForm(form, layer);
						},
						scope : this
					}
				}),
				layer.show();
			},
			validateForm : function(form, layer) {
				form.clearAlert();
				form.resetLabels();
				form.clean();
				var ok = true;
				Ext.each(form.getInputs(), function(i) {
					if (i.type != 'hidden' && !i.validation.disabled) {
						if (!form.validate(form.getValue(i.name), i.validation.type, i.validation.accept, i.validation.reject)) {
							form.alert($('x-apply-alert'), i.validation.text, 'red');
							form.hiliteLabel(i.name, 'red');
							ok = false;
						}
						if (i.maxlength) {
							if (!form.validate(form.getValue(i.name), 'limit', i.maxlength)) {
								form.alert($('x-apply-alert'), i.label + ' is too long. The number characters cannot exceed ' + i.maxlength + ' character'.plural(i.maxlength) + '.', 'red');
								ok = false;
							}
						}
					}
					return ok;
				}, this);
				if (ok) {
				}
			},
			//*** public events
			onBeforeDetailRender : function(content, r) {
				var frag = '<div>Apply Now</div>';
				var listeners = {
					'click' : {
						fn : function(e, t) {
							e.preventDefault();
							this.showForm(r);
						},
						scope : this
					},
					'dblclick' : {
						fn : function(e) {
							e.preventDefault();
						},
						scope : this
					},
					'mouseover' : {
						fn : function(e, t) {
							e.preventDefault();
							$(t).setStyle({
								'border' : '1px solid ' + this.config.hiliteColor,
								'background-color' : '#FFFFFF',
								'color' : this.config.hiliteColor
							});
						},
						scope : this
					},
					'mouseout' : {
						fn : function(e, t) {
							e.preventDefault();
							$(t).setStyle({
								'border' : '1px solid #FFFFFF',
								'background-color' : this.config.hiliteColor,
								'color' : '#FFFFFF'
							});
						},
						scope : this
					}
				};
				var style = {
					'width' : '75px',
					'padding' : '5px 3px',
					'border' : '1px solid #FFFFFF',
					'background-color' : this.config.hiliteColor,
					'color' : '#FFFFFF',
					'line-height' : 'normal',
					'text-align' : 'center',
					'cursor' : 'pointer'
				};
				var el = content.insertHtml('afterBegin', frag, true);
				el.setStyle(style);
				el.setStyle('margin', '0 0 10px 0');
				el.unselectable();
				el.on(listeners);
				el = content.insertHtml('beforeEnd', frag, true);
				el.setStyle(style);
				el.setStyle('margin', '15px 0 0 0');
				el.unselectable();
				el.on(listeners);
			}
		}),
		Team : Ext.extend(IP.web.page.CategorizedList, {
			buildNavLevels : function(box) {
				this.detailTitle = 'Team Profile';
				this.buildNavItem(box.content, 'View All', 'All Team Profiles', [], true);
				if (this.ds.getCount() > 1) {
					var groups = this.ds.collect('group');
					Ext.each(groups, function(group) {
						this.buildNavItem(box.content, group, group + ' Profiles', [
							{
								field : 'group',
								value : group
							}
						], false);
					}, this);
				}
			},
			createListItem : function(r, box, layer) {
				//*** define element
				
				var cropW = r.get('cropw');
				var cropH = r.get('croph');
				var ratioX = 100 / cropW;
				var ratioY = 100 / cropH;
				var iWidth = ratioX * r.get('width');
				var iHeight = ratioY * r.get('height');
				var x = -1 * ratioX * r.get('x');
				var y = -1 * ratioY * r.get('y');
				
				
				var temp = String.format('<div><div></div><div><table><tr><td valign="middle"><div><img src="' + this.config.root + r.get('image') + '" /></div></td><td valign="middle"><span style="display:block;font-size:18px;padding:0 0 7px 0;line-height:.7em;color:' + this.config.hiliteColor + ';">{0}</span>', r.get('name') + (!r.get('credentials').empty() ? ', <span style="font-size:14px;">' + r.get('credentials') + '</span>' : ''));
				var proxy = new Ext.data.MemoryProxy(this.ds.reader.xmlData);
				var reader = new Ext.data.XmlReader({
					record : 'profile[@sort=' + r.get('sort') + ']/positions/position:first'
				}, [
					{name : 'sort', mapping : '@sort', type : 'int', sortDir : 'ASC'},
					{name : 'title'},
					{name : 'company'}
				]);
				var store = new Ext.data.Store({
					proxy : proxy,
					reader : reader
				});
				store.load();
				store.each(function(rec){
					temp += String.format('<span style="display:block;font-size:14px;padding:0 0 3px 0;">{0}</span><span style="display:block;font-size:12px;font-weight:bold;">{1}</span></td></tr></table></div></div>', rec.get('title'), rec.get('company'));
				});
				
				var el = box.content.insertHtml('beforeEnd', temp, true);
				var image = el.child('img');
				var imageWrapper = image.up('div');
				imageWrapper.setStyle({
					'position' : 'relative',
					'border' : '1px solid #FFFFFF',
					'margin' : '0 10px 0 0',
					'width' : '100px',
					'height' : '100px',
					'overflow' : 'hidden'
				});
				image.setStyle({
					'position' : 'absolute',
					'left' :x + 'px',
					'top' : y + 'px',
					'width' : iWidth + 'px',
					'height' : iHeight + 'px'
				});
				
				//*** define layer		
				temp = '<div><table><tr><td valign="top"><div><img src="' + this.config.root + r.get('image') + '" /></div></td><td valign="middle"><span style="display:block;font-size:18px;line-height:.7em;">' + r.get('name') + (!r.get('credentials').empty() ? ',  <span style="font-size:14px;">' + r.get('credentials') + '</span>' : '') + '</span>';
				proxy = new Ext.data.MemoryProxy(this.ds.reader.xmlData);
				reader = new Ext.data.XmlReader({
					record : 'profile[@sort=' + r.get('sort') + ']/positions/position'
				}, [
					{name : 'sort', mapping : '@sort', type : 'int', sortDir : 'ASC'},
					{name : 'title'},
					{name : 'company'}
				]);
				store = new Ext.data.Store({
					proxy : proxy,
					reader : reader
				});
				store.load();
				store.each(function(rec){
					temp += String.format('<span style="display:block;font-size:14px;padding:8px 0 0 0;">{0}</span><span style="display:block;font-size:12px;font-weight:bold;">{1}</span>', rec.get('title'), rec.get('company'));
				});
				temp += '</td></tr></table>';
				
				if (!r.get('mini').empty()) temp += '<span style="display:block;margin:10px 0 0 0;border-top:1px solid #9fa7b4;padding:10px 0 0 0;">' + r.get('mini') + '</span>';

				temp += '</div>';

				image = layer.update(temp).child('img');
				imageWrapper = image.up('div');
				imageWrapper.setStyle({
					'position' : 'relative',
					'border' : '1px solid #9fa7b4',
					'margin' : '0 10px 0 0',
					'width' : '100px',
					'height' : '100px',
					'overflow' : 'hidden'
				});
				image.setStyle({
					'position' : 'absolute',
					'left' :x + 'px',
					'top' : y + 'px',
					'width' : iWidth + 'px',
					'height' : iHeight + 'px'
				});
			
				//*** add to print

				temp = '<div style="margin:0 0 40px 0;line-height:1.3em;"><table><tr><td valign="top"><div><img src="' + this.config.root + r.get('image') + '" /></div></td><td valign="middle"><span style="display:block;font-size:22px;font-weight:bold;line-height:.7em;">' + r.get('name') + (!r.get('credentials').empty() ? ', <span style="font-size:18px;">' + r.get('credentials') + '</span>' : '') + '</span>';
				proxy = new Ext.data.MemoryProxy(this.ds.reader.xmlData);
				reader = new Ext.data.XmlReader({
					record : 'profile[@sort=' + r.get('sort') + ']/positions/position'
				}, [
					{name : 'sort', mapping : '@sort', type : 'int', sortDir : 'ASC'},
					{name : 'title'},
					{name : 'company'}
				]);
				store = new Ext.data.Store({
					proxy : proxy,
					reader : reader
				});
				store.load();
				store.each(function(rec){
					temp += String.format('<span style="display:block;padding:10px 0 0 0;"><i>{0}</i><br /><b>{1}</b></span>', rec.get('title'), rec.get('company'));
				});
				
				temp += '</td></tr></table>';
				
				if (!r.get('mini').empty()) temp += '<span style="display:block;padding:10px 0 0 0;">' + r.get('mini') + '</span>';

				temp += '</div>';

				image = IP.Print.add(temp, true).child('img');
				imageWrapper = image.up('div');				
				imageWrapper.setStyle({
					'position' : 'relative',
					'border' : '1px solid #000000',
					'margin' : '0 10px 0 0',
					'width' : '100px',
					'height' : '100px',
					'overflow' : 'hidden'
				});
				image.setStyle({
					'position' : 'absolute',
					'left' :x + 'px',
					'top' : y + 'px',
					'width' : iWidth + 'px',
					'height' : iHeight + 'px'
				});
				
				this.buildListItem(r, el, layer);				
			}
		})
	},
	advisors : {
		Downloads : Ext.extend(IP.web.page.CategorizedList, {
			buildNavLevels : function(box) {
				this.buildNavItem(box.content, 'View All', 'All Downloads', [], true);
				if (this.ds.getCount() > 1) {
					var categories = this.ds.collect('category');
					Ext.each(categories, function(category) {
						this.buildNavItem(box.content, category, category + ' Downloads', [
							{
								field : 'category',
								value : category
							}
						], true);
						this.filter([{field : 'category', value : category}]);
						var years = this.ds.collect('year');
						if (years.length > 1) {
							Ext.each(years, function(year) {
								this.buildNavItem(box.content, year, year + ' ' + category + ' Downloads', [
									{
										field : 'category',
										value : category
									},
									{
										field : 'year',
										value : year
									}
								], null, true);
							}, this);
						}
					}, this);
				}
			},
			createListItem : function(r, box, layer) {
			
				//*** define element
				var el = box.content.insertHtml('beforeEnd', String.format('<div><div></div><div><div style="display:block;padding:0 0 0px 0;font-size:18px;line-height:1em;color:#006eca;">{0}</div><div><table><tr><td width="30" valign="middle" align="center"><img src="' + this.config.root + 'lib/img/icon-' + r.get('type') + '.gif" /></td><td><b>Date posted:</b> {1}<br /><b>Category:</b> {2}<br /><b>File type:</b> {3}</td></tr></table></div></div></div>', r.get('title'), r.get('date'), r.get('category'), this.getTypeName(r.get('type'))), true);
				
				//*** define layer
				var temp = '<div><div style="display:block;padding:0 0 5px 0;font-size:18px;font-weight:normal;">' + r.get('title') + '</div>' + '<div style="display:block;padding:0 0 0 0;"><table><tr><td width="30" valign="middle" align="center"><img src="' + this.config.root + 'lib/img/icon-' + r.get('type') + '.gif" /></td><td><b>Date posted:</b> ' + r.get('date') + '<br /><b>Category:</b> ' + r.get('category') + '<br /><b>File type:</b> ' + this.getTypeName(r.get('type')) + '</td></tr></table></div>';
				if (!r.get('description').empty()) temp += '<div style="display:block;margin:10px 0 0 0;border-top:1px solid #8dbded;padding:10px 0 0 0;">' + r.get('description') + '</div>';		
				temp += '</div>';		
				layer.update(temp);
				
				//*** add to print
				temp = '<p style="margin:0 0 40px 0"><div style="margin:0 0 2px 0;font-size:18px;font-weight:bold;">' + r.get('title') + '</div><div style="margin:0 0 5px 0"><table><tr><td width="30" valign="middle" align="center"><img src="' + this.config.root + 'lib/img/icon-' + r.get('type') + '.gif" /></td><td><b>Date posted:</b> ' + r.get('date') + '<br /><b>Category:</b> ' + r.get('category') + '<br /><b>File type:</b> ' + this.getTypeName(r.get('type')) + '</td></tr></table></div>';
				if (!r.get('description').empty()) temp += '<div>' + r.get('description') + '</div>';
				temp += '</p>';
				IP.Print.add(temp);

				this.buildListItem(r, el, layer);
			},
			getTypeName : function(type) {
				switch(type) {
					case 'pdf' :
						return 'PDF Document';
						break;
				}
			}
		}),
		RequestMeeting : function(el, c) {
			//*** private properties
			this.config = {
				hiliteColor : '#FFFFFF',
				root : ''
			};
			if (Ext.type(c) == 'object') Ext.apply(this.config, c, this.config);
			this.parent = $(el);
		}
	},
	Flash : {
		print : function(data, node) {
			var print = Ext.decode(unescape(data));	
			IP.Print.clear();
			switch (node) {
				case 'about/history' :
					if (!Ext.isEmpty(print.year)) IP.Print.add('<div style="padding:0 0 15px 0;font-size:28px;font-weight:bold;">' + print.year + '</div>');
					if (!Ext.isEmpty(print.label)) IP.Print.add('<div style="padding:0 0 25px 0;font-size:18px;font-weight:bold;">' + print.label + '</div>');
					if (!Ext.isEmpty(print.img)) IP.Print.add('<div style="padding:0 0 25px 0;"><img src="' + init.r + 'lib/swf/history/' + print.img + '" width="' + print.width + '" height="' + print.height + '" /></div>');
					if (!Ext.isEmpty(print.body)) IP.Print.add('<div>' + print.body + '</div>');
					break;
				case 'stories' :
					if (!Ext.isEmpty(print.name)) IP.Print.add('<div style="padding:0 0 10px 0;font-size:28px;font-weight:bold;">' + print.name + '</div>');
					Ext.each(print.bio, function(o) {
						IP.Print.add('<div style="padding:0 0 7px 0;font-size:16px;"><b>' + o.label + '</b> ' + o.value + '</div>');
					});
					if (!Ext.isEmpty(print.img)) IP.Print.add('<div style="padding:18px 0 25px 0;"><img src="' + init.r + 'lib/swf/stories/' + print.img + '" width="100%" /></div>');
					Ext.each(print.pages, function(o) {
						IP.Print.add('<div style="padding:0 0 25px 0;">' + o.replace('textformat', 'p style="margin: 0 0 0 25px;"')  + '</div>');
					});
					break;
				case 'advisors/stories' :
					if (!Ext.isEmpty(print.name)) IP.Print.add('<div style="padding:0 0 10px 0;font-size:28px;font-weight:bold;">' + print.name + '</div>');
					Ext.each(print.bio, function(o) {
						IP.Print.add('<div style="padding:0 0 7px 0;font-size:16px;"><b>' + o.label + '</b> ' + o.value + '</div>');
					});
					if (!Ext.isEmpty(print.img)) IP.Print.add('<div style="padding:18px 0 25px 0;"><img src="' + init.r + 'lib/swf/advisors/stories/' + print.img + '" width="100%" /></div>');
					Ext.each(print.pages, function(o) {
						IP.Print.add('<div style="padding:0 0 25px 0;">' + o.replace('textformat', 'p style="margin: 0 0 0 25px;"')  + '</div>');
					});
					break;
			}
			IP.Print.style();
		}
	},
	Legal : {
		add : function(el) {
			if (!Ext.isEmpty($(el))) this.getShell().update($(el).getHtml());
		},
		clear : function() {
			this.getShell().update('');
		},
		exists : function() {
			return !Ext.isEmpty($('legal'));
		},
		getHtml : function() {
			return Ext.isEmpty($('legal')) ? '' : this.getShell().getHtml();
		},
		getShell : function() {
			return Ext.isEmpty($('legal')) ? Ext.getBody().insertHtml('beforeEnd', '<div id="legal"></div>', true).hide() : $('legal').hide();
		},
		show : function() {
			this.getShell().show(true);
		}
	},
	News : Ext.extend(IP.web.page.CategorizedList, {
		buildNavLevels : function(box) {
			this.detailTitle = 'News';
			this.buildNavItem(box.content, 'View All', 'All News', [], true);
			if (this.ds.getCount() > 1) {
				var years = this.ds.collect('year');
				Ext.each(years, function(year) {
					this.buildNavItem(box.content, year, year + ' News', [
						{
							field : 'year',
							value : year
						}
					], true);
					this.filter([{field : 'year', value : year}]);
					var months = this.ds.collect('month');
					if (months.length > 1) {
						Ext.each(months, function(month) {
							this.buildNavItem(box.content, Date.getLongMonthName(month - 1), Date.getLongMonthName(month - 1) + ' ' + year + ' News', [
								{
									field : 'year',
									value : year
								},
								{
									field : 'month',
									value : month
								}
							], null, true);
						}, this);
					}
				}, this);
			}
		},
		createListItem : function(r, box, layer) {
		
			//*** define element
			var el = box.content.insertHtml('beforeEnd', String.format('<div><div></div><div><div style="display:block;padding:0 0 4px 0;font-size:18px;line-height:.75em;color:' + this.config.hiliteColor + ';">{0}</div>{1}</div></div>', r.get('title'), r.get('date')), true);
			
			//*** define layer
			var temp = '<div><div style="display:block;padding:0 0 5px 0;font-size:18px;font-weight:normal;">' + r.get('title') + '</div><div style="display:block;padding:0 0 0 0;">' + r.get('date') + '</div>';
			if (!r.get('summary').empty()) temp += '<div style="display:block;margin:10px 0 0 0;border-top:1px solid #b9b2a6;padding:10px 0 0 0;">' + r.get('summary') + '</div>';
			temp += '</div>';
			layer.update(temp);
			
			//*** add to print
			temp = '<p style="margin:0 0 25px 0"><b>' + r.get('title') + '</b><br /><i>' + r.get('date') + '</i>';
			if (!r.get('summary').empty()) temp += '<br />' + r.get('summary');
			IP.Print.add(temp);
			
			this.buildListItem(r, el, layer);
		}
	})
};
Ext.override(IP.client.advisors.RequestMeeting, {
	setCaptcha : function(el) {
		if (!Ext.isEmpty(el.parent().down('img'))) el.parent().down('img').remove();
		return el.insertHtml('beforeBegin', '<img src="' + this.config.root + 'lib/aspx/captcha.aspx?id=' + Ext.ux.Crypto.SHA1.hash(Ext.id()) + '" class="captcha" />', true);
	},
	showForm : function() {
		var alertWrapper = this.parent.insertHtml('beforeEnd', '<div id="x-apply-alert"></div>', true);
		alertWrapper.setStyle({
			'position' : 'absolute',
			'left' : '25px',
			'top' : '-15px',
			'width' : '850px'
		});

		var apply = $('x-apply');

		var form = new IP.page.Form({
			name : 'x-apply-form',
			action : '/',
			method : 'POST',
			onsubmit : false
		});
		form.createInput({
			name : 'xcomments',
			type: 'hidden',
			value : ''
		}, 'x-apply-form', 'afterBegin');
		form.setInput({
			name : 'fname', 
			type : 'text',
			label : 'First Name',
			tabindex : 1,
			value : '',
			maxlength : 50,
			cls : ['input', 'text'],
			style : {'width' : '288px'},
			validation : {
				text : 'Please enter your first name.'
			}
		});
		form.setInput({
			name : 'lname', 
			type : 'text',
			label : 'Last Name',
			tabindex : 2,
			value : '',
			maxlength : 50,
			cls : ['input', 'text'],
			style : {'width' : '288px'},
			validation : {
				text : 'Please enter your last name.'
			}
		});
		form.setInput({
			name : 'cname', 
			type : 'text',
			label : 'Company/Firm Name',
			tabindex : 2,
			value : '',
			maxlength : 200,
			cls : ['input', 'text'],
			style : {'width' : '288px'},
			validation : {
				text : 'Please enter your company/firm name.'
			}
		});
		form.setInput({
			name : 'phone', 
			type : 'text',
			label : 'Phone Number',
			value : '',
			tabindex : 3,
			maxlength : 50,
			cls : ['input', 'text'],
			style : {'width' : '288px'},
			validation : {
				text : 'Please enter a valid phone number.',
				type : 'phone'
			}
		});
		form.setInput({
			name : 'email', 
			type : 'text',
			label : 'Email Address',
			value : '',
			tabindex : 4,
			maxlength : 100,
			cls : ['input', 'text'],
			style : {'width' : '288px'},
			validation : {
				text : 'Please enter a valid email address.',
				type : 'email'
			}
		});
		
		form.setInput({
			name : 'comments',
			type : 'textarea',
			label : 'Describe Your Request (optional)',
			value : '',
			tabindex : 5,
			maxlength : 1000,
			cls : 'textarea',
			style : {'width' : '488px', 'height' : '215px'},
			validation : {
				disabled : true
			}
		});
		
		form.setInput({
			name : 'captcha', 
			type : 'text',
			label : 'Enter Security Code',
			value : '',
			tabindex : 6,
			maxlength : 6,
			cls : ['input', 'text'],
			style : {'width' : '100px', 'position' : 'absolute', 'top' : '10px', 'left' : '170px'},
			validation : {
				text : 'Please enter the security code.',
				type : 'text'
			},
			wrap : true
		});
		form.setAttributes();
		form.setLabels();				
		var captcha = form.getInput('captcha');
		var captchaImage = this.setCaptcha(captcha);
		captchaImage.setStyle({
			'position' : 'absolute',
			'top' : '0', 
			'left' : '0'
		});
		var listeners = {
			'mouseover' : {
				fn : function(e, t) {
					e.preventDefault();
					$(t).setStyle({
						'border' : '1px solid ' + this.config.hiliteColor,
						'background-color' : '#FFFFFF',
						'color' : this.config.hiliteColor
					});
				},
				scope : this
			},
			'mouseout' : {
				fn : function(e, t) {
					e.preventDefault();
					$(t).setStyle({
						'border' : '1px solid #FFFFFF',
						'background-color' : this.config.hiliteColor,
						'color' : '#FFFFFF'
					});
				},
				scope : this
			}
		};
		var style = {
			'position' : 'absolute',
			'width' : '75px',
			'padding' : '5px 3px',
			'border' : '1px solid ' + this.config.hiliteColor,
			'background-color' : this.config.hiliteColor,
			'color' : '#FFFFFF',
			'line-height' : 'normal',
			'text-align' : 'center',
			'cursor' : 'pointer'
		};
		var buttons = $('x-apply').insertHtml('beforeEnd', '<div></div>', true);
		buttons.setStyle({
			'position' : 'relative'
		});
		var button = buttons.insertHtml('beforeEnd', '<div>Submit</div>', true);
		button.setStyle(style);
		button.setStyle('left', '25px');
		button.unselectable();
		button.on(listeners);
		button.on({					
			'click' : {
				fn : function(e, t) {
					e.preventDefault();
					this.validateForm(form);
				},
				scope : this
			}
		});
		this.parent.show(true);
	},
	validateForm : function(form) {
		form.clearAlert();
		form.resetLabels();
		form.clean();
		var ok = true;
		Ext.each(form.getInputs(), function(i) {
			if (i.type != 'hidden' && !i.validation.disabled) {
				if (!form.validate(form.getValue(i.name), i.validation.type, i.validation.accept, i.validation.reject)) {
					form.alert($('x-apply-alert'), i.validation.text, 'red');
					form.hiliteLabel(i.name, 'red');
					ok = false;
				}
				if (i.maxlength) {
					if (!form.validate(form.getValue(i.name), 'limit', i.maxlength)) {
						form.alert($('x-apply-alert'), i.label + ' is too long. The number characters cannot exceed ' + i.maxlength + ' character'.plural(i.maxlength) + '.', 'red');
						ok = false;
					}
				}
			}
			return ok;
		}, this);
		if (ok) {
			var mask = $('wrapper').insertHtml('beforeEnd', '<div></div>', true);
			mask.setStyle({
				'position' : 'absolute',
				'left' : '0',
				'top' : '0',
				'background-color' : '#000000',
				'z-index' : '9000'
			});
			mask.setSize($('wrapper').getWidth()-$('wrapper').getBorderWidth('lr'), $('wrapper').getHeight()-$('wrapper').getBorderWidth('tb'));
			mask.setOpacity(.75);
			mask.show();
			
			var layer = $('wrapper').insertHtml('beforeEnd', '<div></div>', true);
			layer.setStyle({
				'position' : 'absolute',
				'background-color' : '#FFFFFF',
				'border' : '3px solid #999999',
				'padding' : '15px 50px',
				'color' : '#333333',
				'font-family' : 'arial',
				'font-size' : '12px',
				'line-height' : '1.5em',
				'font-family' : 'bold',
				'z-index' : '9001',
				'text-align' : 'center'
			});
			layer.update('Processing request...');
			layer.setXY([(($('wrapper').getWidth()-$('wrapper').getBorderWidth('lr'))/2)-(layer.getWidth()/2) + $('wrapper').getX(),(($('wrapper').getHeight()-$('wrapper').getBorderWidth('tb'))/2)-(layer.getHeight()/2) + $('wrapper').getY()]);
			form.getInput('xcomments').setValue(form.getInput('comments').getValue().replace(/[\n\r]/g, '[@br]'));
			Ext.Ajax.request({
				url : this.config.root + 'lib/aspx/mail.aspx',
				method : 'POST',
				params : Ext.Ajax.serializeForm('x-apply-form'),
				callback : function(options, success, response) {
					var captcha = form.getInput('captcha');
					captcha.setValue('');
					this.setCaptcha(captcha);
					if (success) {
						if (response.responseText == 'ok') {
							form.getInput('fname').setValue('');
							form.getInput('lname').setValue('');
							form.getInput('cname').setValue('');
							form.getInput('phone').setValue('');
							form.getInput('email').setValue('');
							form.getInput('comments').setValue('');
							form.getInput('xcomments').setValue('');
							form.alert($('x-apply-alert'), 'Your request has been sent to a Pacific Bridge representative.  Thank you.', 'green');
						} else {
							form.alert($('x-apply-alert'), 'Your request could not be sent. Please verify your input and try again.', 'orange');
						}
					} else {
						form.alert($('x-apply-alert'), 'An error was encountered while processing your request. Please try again.', 'orange');
					
					}
					mask.remove();
					layer.remove();
				},
				scope : this
			});
			
			//
			
		}
	}
});
