/*	company.js

	dargaville.biz
	
	Warn:
	textarea id=description failed in IE, reason to prefix fields with co i.e. coDescription
*/

if(!window.JOE){var JOE={};}
// force initialisation for each request
JOE.data={};
JOE.data.company={};
JOE.data.tag={};
JOE.tmp={
	companyTags:[],	// required to store  comapny tags because IE does not disable options
	contactsArr:[],
	listingsArr:[],
	tagsArr:[]
};

JOE.fn={
	companyCreate:function(company){
		var	jdc=JOE.data.company,
			jdl=JOE.data.listing,
			jdp=JOE.data.place,
			jdt=JOE.data.tag,
			jfn=JOE.fn,
			html='';
		// display
		$('companyRemove').innerHTML='';
		// place list
		for(var p in jdp){
			html+='<option value="'+p+'">'+jdp[p]+'</option>';
		}
		html='<br />\
		<label for="coName">Name</label><input type="text" size="50" id="coName" /><br />\
		<label for="coManager">Manager</label><input type="text" size="50" id="coManager" /><br />\
		<label for="coAddress">Address</label><input type="text" size="50" id="coAddress" /><br />\
		<label for="coPlace">Place</label>\
			<select id="coPlace">\
				<option value="-1">Enter company location</option>'+html+'\
			</select><br />\
		<label for="coEmail">Email</label><input type="text" size="50" id="coEmail" /><br />\
		<label for="coWebsite">Website http://</label><input type="text" size="50" id="coWebsite" /><br />\
		Description<br /><textarea rows="2" cols="60" id="coDescription"></textarea><br />\
		<table border="0" id="coContacts">\
		<thead><tr><th>Phone/Fax/Other</th><th>Note</th><th></th></tr></thead>\
		<tbody><tr>\
			<td><input type="text" size="30"/></td>\
			<td><input type="text" size="40"/></td>\
			<td><input type="button" id="contactAdd" value="add"/></td>\
		</tr></tbody></table>\
		<table border="0" id="tags">\
		<thead><tr><th>Primary Business Types</th><th></th></tr></thead>\
		<tbody>\
			<tr><td><select id="newTag">\
				<option value="-1">Select and add your primary business activity categories </option>';
		for(var tg in jdt){
			html+='<option value="'+tg+'">'+jdt[tg][1]+'</option>';
		}
		html+='</select></td><td><input type="button" id="tagAdd" value="add"/></td></tr><tbody></table>';
		// listings
		html+='<br />Include in:\
			<div id="coListings">\
			<table border="0"><tbody>\
				<tr><th colspan="2">(Note: Community is for charitable, volunteer and community groups.)</th></tr>';
		for(var li in jdl){
			html+='<tr><td><label for="list'+li+'">'+jdl[li][0]+'</label></td><td><input type="checkbox" id="list'+li+'" value="'+li+'" /></td></tr>';
		}
		html+='</tbody></table></div>';
		$('companyDetails').innerHTML=html;
		$('companyDetails').setStyle('display','block');	// ensure displayed - remove can hide
		// actions
		$('companyActions').innerHTML='<b>3.</b>\
			<input type="button" id="companyDetailsReload" value="clear" /> or \
			<input type="button" id="companyDetailsSave" value="save" disabled/> \
			<div id="saveResponse"></div>';
		// event triggers for New Company
		$('companyDetailsReload').addEvent('click',JOE.fn.companyCreate);
		$('companyDetailsSave').addEvent('click',JOE.fn.saveCompanyCreate);
		$('companyDetails').addEvent('keyup',JOE.fn.companyDetailsActions);
		$('coPlace').addEvent('change',JOE.fn.companyDetailsActions);
		$('contactAdd').addEvent('click',JOE.fn.contactAdd);
		$('tagAdd').addEvent('click',JOE.fn.tagAdd);
		$$('input.remove').addEvent('click',JOE.fn.trRemove);
		// focus
		$('coName').focus();
	},
	companyDetailsActions:function(){
		var enable=true;
		if(typeof arguments[0]!='undefined') enable=arguments[0];
		// no arguments set false
		$('companyDetailsReload').setProperty('disabled',!enable);
		$('companyDetailsSave').setProperty('disabled',!enable);
		$('saveResponse').set('text','');
	},
	companySelection:function(){
		var	jdc=JOE.data.company,
			jdt=JOE.data.tag,
			jfn=JOE.fn,
			html='';
		$('response').set('text','');
		$('key').value='your company key';
		$('unlock').setStyle('visibility','hidden');
		// build 
		for(var c in jdc){
			html+='<option value="'+c+'">'+jdc[c][0]+'</option>';
		}
		$('company').innerHTML='<br /><nobr><b>2.</b> <select id="selectCompany">\
				<option>Select your company</option>\
				<option id="newCompanyOption">**Create a new company**</option>'+html+'</select>\
				<div id="selectCompanyMessage"></div></nobr><br />';
		// options
		$('selectCompany').addEvent('change',function(){
			$('selectCompanyMessage').innerHTML='';
			if(this.selectedIndex>1) jfn.companyUpdate();
			else if(this.selectedIndex==1) jfn.companyCreate();
			else if(this.selectedIndex==0){
				$('companyDetails').innerHTML='';
				$('companyRemove').innerHTML='';
				$('companyActions').innerHTML='';
			}
		});
	},
	companyUpdate:function(){
		var	company=$('selectCompany').value,
			jdc=JOE.data.company,
			jdl=JOE.data.listing,
			jdp=JOE.data.place,
			jdt=JOE.data.tag,
			jfn=JOE.fn,
			html='';
		// place list
		for(var p in jdp){
			html+='<option value="'+p+'" '+(jdc[company][3]==p?'selected':'')+'>'+jdp[p]+'</option>';
		}
		html='<br />\
		<label for="coName">Name</label><input type="text" size="50" id="coName" /><br />\
		<label for="coManager">Manager</label><input type="text" size="50" id="coManager" /><br />\
		<label for="coAddress">Address</label><input type="text" size="50" id="coAddress" /><br />\
		<label for="coPlace">Place</label><select id="coPlace">'+html+'</select><br />\
		<label for="coEmail">Email</label><input type="text" size="50" id="coEmail" /><br />\
		<label for="coWebsite">Website http://</label><input type="text" size="50" id="coWebsite" /><br />\
		Description<br /><textarea rows="2" cols="60" id="coDescription"></textarea><br />\
		<table border="0" id="coContacts">\
		<thead><tr><th>Phone/Fax/Other</th><th>Note</th><th></th></tr></thead>\
		<tbody>';
		// contacts
		for(var ph=0,l=jdc[company][7].length;ph<l;ph++){
			html+='<tr>\
			<td><input type="text" size="30" id="coContactRef'+ph+'" /></td>\
			<td><input type="text" size="40" id="coContactNote'+ph+'" /></td>\
			<td><input type="button" class="remove" value="remove" /></td>\
			</tr>';
		}
		html+='<tr>\
		<td><input type="text" size="30" /></td>\
		<td><input type="text" size="40" /></td>\
		<td><input type="button" id="contactAdd" value="add" /></td>\
		</tr>\
		<tbody></table>\
		<table border="0" id="tags">\
		<thead><tr><th>Primary Business Types</th><th></th></tr></thead>\
		<tbody>';
		// tags
		for(var tg=0,l=jdc[company][8].length;tg<l;tg++){
			html+='<tr>\
			<td><span id="tag'+jdc[company][8][tg]+'">'+jdt[jdc[company][8][tg]][1]+'</span></td>\
			<td><input type="button" class="remove" value="remove" /></td>\
			</tr>';
		}
		html+='<tr><td><select id="newTag"><option value="-1">Select and add your primary business activity categories </option>';
		for(var tg in jdt){
			// stupid IE does not support disabled
			var noTag=jdc[company][8].indexOf(parseInt(tg))==-1;
			if(!document.all){
				html+='<option value="'+tg+'" '+
					(noTag?'':'disabled')+
					'>'+jdt[tg][1]+'</option>';
			}else{
				html+='<option value="'+tg+'">'+jdt[tg][1]+'</option>';
				if(!noTag) JOE.tmp.companyTags.push(tg);
			}
		}
		html+='</select></td><td><input type="button" id="tagAdd" value="add" /></td></tr></tbody></table>';
		// listings
		html+='<br />Include in:\
			<div id="coListings">\
			<table border="0"><tbody>\
				<tr><th colspan="2">(Note: Community is for charitable, volunteer and community groups.)</th></tr>';
		for(var li in jdl){
			html+='<tr><td><label for="list'+li+'">'+jdl[li][0]+'</label></td><td><input type="checkbox" id="list'+li+'" value="'+li+'" '+(jdc[company][9].indexOf(parseInt(li))==-1?'':'checked')+' /></td></tr>';
		}
		html+='</tbody></table></div>';
		$('companyDetails').innerHTML=html;
		$('companyDetails').setStyle('display','block');	// ensure displayed - remove can hide
		// populate data, done this way to prevent XXS with innerHTML
		$('coName').value=jdc[company][0];
		$('coManager').value=jfn.definedOrEmpty(jdc[company][1]);
		$('coAddress').value=jfn.definedOrEmpty(jdc[company][2]);
		$('coEmail').value=jfn.definedOrEmpty(jdc[company][4]);
		$('coWebsite').value=jfn.definedOrEmpty(jdc[company][5]);
		$('coDescription').value=jfn.definedOrEmpty(jdc[company][6]);
		// contacts
		for(var ph=0,l=jdc[company][7].length;ph<l;ph++){
			$('coContactRef'+ph).value=jdc[company][7][ph][0];
			$('coContactNote'+ph).value=jfn.definedOrEmpty(jdc[company][7][ph][1]);
		}
		$('companyRemove').innerHTML='<label for="removeCompany">Remove company</label> <input type="checkbox" id="removeCompany" />';
		// actions
		$('companyActions').innerHTML='<b>3.</b>\
			<input type="button" id="companyDetailsReload" value="reload" disabled /> or \
			<input type="button" id="companyDetailsSave" value="save" disabled /> \
			<div id="saveResponse"></div>';
		// event triggers for Update
		$('companyDetailsReload').addEvent('click',JOE.fn.companyUpdate);
		$('companyDetailsSave').addEvent('click',JOE.fn.saveCompanyUpdate);
		$('companyDetails').addEvent('keyup',JOE.fn.companyDetailsActions);
		$('coPlace').addEvent('change',JOE.fn.companyDetailsActions);
		$('contactAdd').addEvent('click',JOE.fn.contactAdd);
		$('tagAdd').addEvent('click',JOE.fn.tagAdd);
		$('coListings').addEvent('click',JOE.fn.companyDetailsActions);
		$$('input.remove').addEvent('click',JOE.fn.trRemove);	// remove buttons
		$('removeCompany').addEvent('click',function(){
			if($('removeCompany').checked){
				alert('Warning:\nChecking this box will entirely delete this company when the save button is pressed.\nTo cancel this action uncheck the box.\nRemoving a company will reload the page.');
				$('companyDetails').setStyle('display','none');
				JOE.fn.companyDetailsActions(true);
			}else
				$('companyDetails').setStyle('display','block');
		});
	},
	contactAdd:function(){	// add contact tr record
		// contact must exist
		var	tr=this.getParent().getParent(),
			tab=tr.getParent(),
			el=tr.getElementsByTagName('input')[0],
			td2=tr.getElementsByTagName('td')[2];
		if(el.value==''){
			el.focus();
			alert('please enter a contact number');
			return false;
		}
		td2.innerHTML='<input type="button" class="remove" value="remove"/>';
		// IE does not support innerHTML on TR
		var trNew=document.createElement('tr'),
			td1=document.createElement('td'),
			td2=document.createElement('td'),
			td3=document.createElement('td');
		trNew.appendChild(td1);
		trNew.appendChild(td2);
		trNew.appendChild(td3);
		tab.appendChild(trNew);
		td1.innerHTML='<input type="text" size="30"/>';
		td2.innerHTML='<input type="text" size="40"/>';
		td3.innerHTML='<input type="button" id="contactAdd" value="add"/>';
		$('contactAdd').addEvent('click',JOE.fn.contactAdd);
		// reassign events
		$$('input.remove').addEvent('click',JOE.fn.trRemove);
		// enable reload and save
		JOE.fn.companyDetailsActions(true);
		return true;
	},
	definedOrEmpty:function(x){return $defined(x)?x:'';},
	preparePOST:function(action,company){
		// format post - after verifyData
		var post='&key='+JOE.key+'&action='+action+'&co='+company+
			'&name='+encodeURIComponent($('coName').value)+
			'&manager='+encodeURIComponent($('coManager').value)+
			'&address='+encodeURIComponent($('coAddress').value)+
			'&place='+$('coPlace').value+
			'&email='+encodeURIComponent($('coEmail').value)+
			'&website='+encodeURIComponent($('coWebsite').value)+
			'&description='+encodeURIComponent($('coDescription').value);
		// contacts
		for(var i=0,l=JOE.tmp.contactsArr.length;i<l;i++){
			post+='&contactRef[]='+encodeURIComponent(JOE.tmp.contactsArr[i][0])+
				'&contactNote[]='+encodeURIComponent(JOE.tmp.contactsArr[i][1]);
		}
		// tags
		for(var i=0,l=JOE.tmp.tagsArr.length;i<l;i++){
			post+='&tag[]='+JOE.tmp.tagsArr[i];
		}
		// listings
		for(var i=0,l=JOE.tmp.listingsArr.length;i<l;i++){
			post+='&listing[]='+JOE.tmp.listingsArr[i];
		}
		return post;
	},
	saveCompanyCreate:function(){
		if(!JOE.fn.verifyData()) return false;
		var post='';
		
		post=JOE.fn.preparePOST('i',-1);
		
		var req=new Request({
			url:'update.php',
			data:post,
			onRequest:function(){
				JOE.fn.companyDetailsActions(false);
				$('saveResponse').set('text','Saving...');
			},
			onSuccess:function(responseText,responseXML){
				JOE.error='';
				eval(responseText);
				if(JOE.error!=''){
					$('saveResponse').set('text','Failed');
					alert(JOE.error);
				}
				else{
					// create JOE.data
					var jdc=JOE.data.company,
						co=JOE.newCompanyId;
					jdc[co]=[
						$('coName').value,
						$('coManager').value,
						$('coAddress').value,
						$('coPlace').value,
						$('coEmail').value,
						$('coWebsite').value,
						$('coDescription').value,
						JOE.tmp.contactsArr,
						JOE.tmp.tagsArr,
						JOE.tmp.listingsArr];
					$('selectCompanyMessage').set('text','Company Created');
					// update select list
					new Element('option',{'value':co,'html':jdc[co][0]}).injectAfter($('newCompanyOption'));
					$('selectCompany').selectedIndex=2;
					JOE.fn.companyUpdate();
				}
			},
			onFailure:function(){
				$('selectCompanyMessage').set('text','Company create failed');
				$('saveResponse').set('text','Create failed');
			}
		}).send();
		return true;
	},
	saveCompanyUpdate:function(){
		var company=$('selectCompany').value,
			jdc=JOE.data.company,
			post='';
		// if not deleting
		if($('removeCompany').checked){
			post='key='+JOE.key+'&action=d&co='+company;
		}else{
			if(!JOE.fn.verifyData()) return false;
			post=JOE.fn.preparePOST('u',company);
		}
		var req=new Request({
			url:'update.php',
			data:post,
			onRequest:function(){
				JOE.fn.companyDetailsActions(false);
				$('saveResponse').set('text','Saving...');
			},
			onSuccess:function(responseText,responseXML){
				JOE.error='';
				eval(responseText);
				if(JOE.error!=''){
					$('companyDetailsReload').setProperty('disabled',false);
					$('saveResponse').set('text','Failed');
					alert(JOE.error);
				}
				else{
					if($('removeCompany').checked){
						$('selectCompanyMessage').set('text','Company '+$('coName').value+' Removed');
						$('selectCompany').remove($('selectCompany').selectedIndex);
						$('selectCompany').selectedIndex=0;
						delete jdc[company];
						$('companyDetails').innerHTML='';
						$('companyRemove').innerHTML='';
						$('companyActions').innerHTML='';
					}else{
						// update JOE.data
						jdc[company][0]=$('coName').value;
						jdc[company][1]=$('coManager').value;
						jdc[company][2]=$('coAddress').value;
						jdc[company][3]=$('coPlace').value;
						jdc[company][4]=$('coEmail').value;
						jdc[company][5]=$('coWebsite').value;
						jdc[company][6]=$('coDescription').value;
						jdc[company][7]=JOE.tmp.contactsArr;
						jdc[company][8]=JOE.tmp.tagsArr;
						jdc[company][9]=JOE.tmp.listingsArr;
						$('selectCompanyMessage').set('text','Company Updated');
						$('saveResponse').set('text','Saved');
					}
				}
			}
		}).send();
		return true;
	},
	tagAdd:function(){	// add tag tr record
		// contact must exist
		var	tr=this.getParent().getParent(),
			tab=tr.getParent(),
			el=tr.getElementsByTagName('select')[0],
			jdt=JOE.data.tag;
		if(el.selectedIndex==0){
			el.focus();
			alert('please select your business type');
			return false;
		}
		if(JOE.tmp.companyTags.indexOf(el.value)!=-1){
			el.focus();
			alert('This company already has this tag');
			return false;
		}
		var trNew=document.createElement('tr'),
			td1=document.createElement('td'),
			td2=document.createElement('td');
		tab.insertBefore(trNew,tr);
		trNew.appendChild(td1);
		trNew.appendChild(td2);
			
		td1.innerHTML='<span id="tag'+el.value+'">'+jdt[el.value][1]+'</span>';
		td2.innerHTML='<input type="button" class="remove" value="remove" />';
		// IE  add
		if(document.all) JOE.tmp.companyTags.push(el.value);

		// disable and reset selection
		el.options[el.selectedIndex].disabled=true;
		el.selectedIndex=0;
		// re-apply remove triggers
		$$('input.remove').addEvent('click',JOE.fn.trRemove);
		// enable reload and save
		JOE.fn.companyDetailsActions(true);
		return true;
	},
	trRemove:function(){	// remove tr
		var	tr=this.getParent().getParent();
		// if a tag un-disable option
		if(tr.getParent().getParent().getProperty('id')=='tags'){
			var tag=tr.getElementsByTagName('span')[0].id.substr(3),
				opts=document.getElementById('newTag').options;
			// re-enable
			// stupid IE does not support disabled
			if(!document.all)
			for(var o in opts){
				if(opts[o].value==tag){
					opts[o].disabled=false;
				}
			}else
			// IE remove
			JOE.tmp.companyTags.splice(JOE.tmp.companyTags.indexOf(tag),1);
		}
		tr.getParent().removeChild(tr);
		// enable reload and save
		JOE.fn.companyDetailsActions(true);
	},
	verifyData:function(){
		if($('coName').value==''){
			$('coName').focus();
			alert('Company name must be specified');
			return false;
		}
		
		
		
		
				// XXS - not comprehensive
/*
		// remove onclick...
		$string = preg_replace('#(<[^>]+[\s\r\n\"\'])(on|xmlns)[^>]*>#iU',"$1>",$string);
		
		do{
			$oldstring=$string;
			$string=preg_replace('#</*(applet|meta|xml|blink|link|style|script|embed|object|iframe|frame|frameset|ilayer|layer|bgsound|title|base)[^>]*>#i',"",$string);
		} while ($oldstring!=$string);
*/ 

		
		
		
		if($('coAddress').value==''){
			$('coAddress').focus();
			alert('Some address must be specified');
			return false;
		}
		if($('coPlace').value<0){
			$('coPlace').focus();
			alert('Company location must be specified');
			return false;
		}
		var coWebsite=$('coWebsite').value;
		if($('coWebsite').value!=''&&$('coWebsite').value.substr(0,4).toLowerCase()=='http'){
			$('coWebsite').focus();
			alert('Do not enter the http:// part for your website URL');
			return false;
		}
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if($('coEmail').value.length>0&&!(filter.test($('coEmail').value))){
			$('coEmail').focus();
			alert('Please check your company email format');
			return false;
		};
		// contacts
		var TR=$('coContacts').getElementsByTagName('tr');
		JOE.tmp.contactsArr=[];	// clear and remember for save
		for(var tr=0,l=TR.length;tr<l;tr++){
			var inp=TR[tr].getElementsByTagName('input');
			if(inp.length>0&&inp[0].value!=''){
				JOE.tmp.contactsArr.push([inp[0].value,inp[1].value]);
			}
		}
		if(JOE.tmp.contactsArr.length==0){
			alert('Please ensure a least one contact phone number is specified');
			return false;
		}
		// tags
		var TR=$('tags').getElementsByTagName('tr');
		JOE.tmp.tagsArr=[];	// clear and remember for save
		if($('newTag').selectedIndex>0){
			JOE.tmp.tagsArr.push(parseInt($('newTag').value));
		}
		for(var tr=0,l=TR.length;tr<l;tr++){
			var span=TR[tr].getElementsByTagName('span');
			if(span.length>0){
				JOE.tmp.tagsArr.push(parseInt(span[0].id.substr(3)));
			}
		}
		if(JOE.tmp.tagsArr.length==0){
			alert('Please ensure a least one business or community tag has been specified');
			return false;
		}
		// listings
		var lst=$('coListings').getElementsByTagName('input');
		JOE.tmp.listingsArr=[];	// clear and remember for save
		for(var i=0,l=lst.length;i<l;i++){
			if(lst[i].checked){
				JOE.tmp.listingsArr.push(parseInt(lst[i].value));
			}
		}
		if(JOE.tmp.listingsArr.length==0){
			alert('Your company or community group must be assigned to a directory');
			return false;
		}
		return true;
	}
}

window.addEvent('domready',function(){
	// company key
	$('key').addEvent('focus',function(){
		$('company').innerHTML='';
		$('companyDetails').innerHTML='';
		$('companyRemove').innerHTML='';
		$('companyActions').innerHTML='';
		if(this.value=='your company key') this.value='';
	});
	$('key').addEvent('blur',function(){
		if(this.value=='') this.value='your company key';
	});
	$('key').addEvent('keyup',function(){
		$('unlock').setStyle('visibility',(this.value.length==0?'hidden':'visible'));
	});
	// unlock button
	$('unlock').addEvent('click',function(e){
		new Event(e).stop();
		// CHAP key
		JOE.key=md5.hex_md5($('key').value+md5.hex_md5(JOE.session.challenge));
		// $(adminForm).send wouldn't work
		var req=new Request({
			url:'update.php',
			data:'key='+JOE.key,
			onRequest:function(){$('response').set('text','Loading...');},
			onSuccess:function(responseText,responseXML){
				// clear error
				JOE.error='';
				$('response').set('text','evaluating results...');
				eval(responseText);
				if(JOE.error!=''){
					$('response').set('text',JOE.error);
					$('company').innerHTML='<p>A company key must be obtained before company administration can be performed.</p>';
				}else JOE.fn.companySelection();
			},
			onFailure:function(){$('response').set('text','Sorry, an error occured accessing the administration system.');}
		}).send();
	});
	
});