Event.observe(window,'load',function(){
	
	new WebTrack();

});

var WebTrack = Class.create({

	initialize: function(settings){
		
		this.pages		= new Array();
		this.settings	= $H(this.defaults).update($H(settings)).toObject();
		
		this.loadElements();
		
		this.loadListeners();
		
		this.loadObjects();
		
	},
	
	cleanResultsClasses: function(){
		
		this.pagingContainer.select('a.on').each(function(element){ element.removeClassName('on'); });
		
	},
	
	gotoPage: function(page){
		
		this.pages.each(function(obj){ obj.hidePage(); },this);
		
		this.pages[page].showPage();
		
	},
	
	hideActive: function(){
		
		this.detailContainer.select('.tracking-body').each(function(element){ element.hide(); });
		
	},
	
	loadElements: function(){
		
		this.detailContainer	= $(this.settings.results_id);
		this.loader				= $(this.settings.loader_id);
		this.pagingContainer	= $(this.settings.paging_id);
		this.trackingNav		= $(this.settings.nav_id);
		
	},
	
	loadListeners: function(){
		
		// Listener Types
		//     .email	- email results
		//     .print	- print results
		//     .track	- track another package
		//     .updates	- email notification
		
		try{
			this.trackingNav.select('a').each(function(element){
				
				if(element.hasClassName('track')){
					element.observe('click',this.loadTrackForm.bindAsEventListener(this));
				}else if(element.hasClassName('updates')){
					element.observe('click',this.loadEmailUpdates.bindAsEventListener(this));
				}else if(element.hasClassName('print')){
					element.observe('click',this.loadPrintLink.bindAsEventListener(this));
				}else if(element.hasClassName('email')){
					element.observe('click',this.loadEmailResults.bindAsEventListener(this));
				}
				
			},this);
		}catch(err){}
		
	},
	
	loadObjects: function(){
		
		this.loadPages();
		
	},
	
	loadPages: function(){
		
		try{
		
			var pages = this.pagingContainer.select('.page');
			
			pages.each(function(element,i){
				
				var isOpen = (i == 0)?true:false;
				
				this.pages[i] = new WebTrack.Paging(this,element,i,isOpen);
			
			},this);
			
		}catch(err){}
		
	},
	
	loadEmailUpdates: function(event){
		
		Event.stop(event);
		
		new WebTrack.Updates(this,
							 this.trackingNav.getAttribute('data-trackingnumber'),
							 this.trackingNav.getAttribute('data-lasteventid'),
							 this.trackingNav.getAttribute('data-pickup'),
							 this.trackingNav.getAttribute('data-receivedate')
							 );
		
	},
	
	loadEmailResults: function(event){
		
		Event.stop(event);
		
		new WebTrack.Email(this,
						   this.trackingNav.getAttribute('data-trackingnumber'),
						   this.trackingNav.getAttribute('data-lasteventid'),
						   this.trackingNav.getAttribute('data-pickup'),
						   this.trackingNav.getAttribute('data-receivedate')
						   );
		
	},
	
	loadPrintLink: function(event){
		
		var element = event.element();
		
		if(element.getAttribute('data-bypass') != 1){
		
			Event.stop(event);
			
			window.print();
			
		}
		
	},
	
	loadFavesLink: function(event){
		
		Event.stop(event);
		
	},
	
	loadTrackForm: function(event){
		
		Event.stop(event);
		
		new WebTrack.Search(this);
		
	},
	
	updateTrackingNumber: function(tn,eventId,delconFlag,classId,pickup,receiveDate){
		
		this.trackingNav.setAttribute('data-trackingnumber',tn);
		this.trackingNav.setAttribute('data-lasteventid',eventId);
		this.trackingNav.setAttribute('data-pickup',pickup);
		this.trackingNav.setAttribute('data-receivedate',receiveDate);
		
		if(eventId < 600 && delconFlag == 1){
			try{ this.trackingNav.down('.notify').show(); }catch(err){}
		}else{
			try{ this.trackingNav.down('.notify').hide(); }catch(err){}
		}
		
		// Update Print Link
		try{ $('printLink').href = './print.cfm?trackingnumber=' + tn; }catch(err){}
		
	},
	
	defaults: {
		'results_id':'resultsContainer',
		'loader_id':'trackingLoader',
		'paging_id':'pagingContainer',
		'nav_id':'trackingNav'
	}

});

WebTrack.Search = Class.create({

	initialize: function(parent){
		
		this.parent		= parent;
		this.form		= this.buildForm();
		this.element	= this.buildContainer();
		
		this.build();
		this.listen();
		this.launch();
		
	},
	
	launch: function(){
		
		this.modal = new Modal(this.element,{'dropzone':'center-rail','blockbackground':true,'showclose':true});
		this.modal.openBox();
		
		this.form.focusFirstElement();
		
	},
	
	listen: function(){
		
		this.form.observe('submit',function(event){
			
			var trackNumber = $F('trackingNumber').strip();
			
			if(trackNumber == ''){
				Event.stop(event);
				alert('Please enter a number to track.');
			}
			
		});
		
	},
	
	build: function(){
		
		this.element.appendChild(this.form);
		
	},
	
	buildContainer: function(){
		
		var div = new Element('div');
		
		div.appendChild(new Element('h1',{'class':'modal_hd'}).update('Track Another Package(s)'));
		
		return div;
		
	},
	
	buildForm: function(){
		
		var form = new Element('form',{'action':'','method':'get'});
		
		form.appendChild(new Element('label').update('<strong>Enter Tracking Number(s):</strong><br><small>Enter up to <strong>50 DHL Global Mail</strong> or <strong>delivery confirmation</strong> numbers</small>'));
		form.appendChild(new Element('br'));
		form.appendChild(new Element('textarea',{'id':'trackingNumber','name':'trackingnumber','cols':'40','rows':'5'}).update(window.location.toString().toQueryParams().trackingnumber));
		form.appendChild(new Element('br'));
		
		form.appendChild(new Element('input',{'type':'submit','value':' ','class':'track-button','onmouseover':'this.className="track-button-hover"','onmouseout':'this.className="track-button"'}));
		
		return form;
		
	}

});

WebTrack.Email = Class.create({

	initialize: function(parent,trackingNumber,eventId,pickup,receiveDate){
		
		this.parent			= parent;
		this.trackingNumber = trackingNumber;
		this.eventId		= eventId;
		this.pickup			= pickup;
		this.receiveDate	= receiveDate;
		this.form			= this.buildForm();
		this.element		= this.buildElement();
		
		this.listen();
		this.launch();
		
	},
	
	launch: function(){
		
		this.modal = new Modal(this.element,{'dropzone':'center-rail','blockbackground':'true','showclose':true});
		this.modal.openBox();
		
		this.form.focusFirstElement();
		
	},
	
	listen: function(){
		
		this.form.observe('submit',this.processForm.bindAsEventListener(this));
		
	},
	
	processForm: function(event){
		
		Event.stop(event);
		
		if(this.isValid()){
			
			this.button.disable();
			
			var url = 'json/webtrack.cfm?method=emailResults&'
				url += this.form.serialize();
			
			new AjaxRequest(url,this._processFormOnSuccess.bind(this));
			
		}

	},
	
	_processFormOnSuccess: function(response){
		
		if(response.results.STATUS == 1){
			
			this.modal.closeBox();
			
			var content = new Element('div');
			content.appendChild(new Element('h2',{'class':'green'}).update('Success!'));
			content.appendChild(new Element('span').update(response.results.MESSAGE));
			
			new Modal(content,{'dropzone':'center-rail','showclose':true}).openBox();
			
		}else{
			
			this.button.enable();
			
			alert(response.results.MESSAGE);
			
		}
		
	},
	
	buildElement: function(){
		
		var element = new Element('div');
		
		element.appendChild(new Element('h1',{'class':'modal_hd'}).update('E-Mail Tracking Results'));
		element.appendChild(this.form);
		
		return element;
		
	},
	
	buildForm: function(){
		
		var form	= new Element('form',{'class':'email_results'});
		var col1	= new Element('div',{'class':'col split'});
		var colSep	= new Element('div',{'class':'col sep'}).update('&nbsp;');
		var col2	= new Element('div',{'class':'col split'});
		
		// Column 1
		col1.appendChild(new Element('label',{'for':'from_name'}).update('From Name'));
		col1.appendChild(new Element('br'));
		col1.appendChild(new Element('input',{'type':'text','name':'from_name','size':32}));
		col1.appendChild(new Element('br'));
		
		col1.appendChild(new Element('label',{'for':'from_email_address'}).update('From E-Mail Address'));
		col1.appendChild(new Element('br'));
		col1.appendChild(new Element('input',{'type':'text','name':'from_email_address','size':32}));
		col1.appendChild(new Element('br'));
		
		col1.appendChild(new Element('label',{'for':'to_email_address'}).update('To E-Mail Address(es)'));
		col1.appendChild(new Element('br'));
		col1.appendChild(new Element('small').update('Separate multiple addresses with a comma'));
		col1.appendChild(new Element('br'));
		col1.appendChild(new Element('textarea',{'cols':'35','rows':'3','name':'to_email_address'}));
		
		// Column 2
		col2.appendChild(new Element('label').update('Custom Subject <span class="gray">(Optional)</span>'));
		col2.appendChild(new Element('br'));
		col2.appendChild(new Element('input',{'type':'text','name':'email_subject','size':32}));
		col2.appendChild(new Element('br'));
		
		col2.appendChild(new Element('label').update('Custom Message <span class="gray">(Optional)</span>'));
		col2.appendChild(new Element('br'));
		col2.appendChild(new Element('textarea',{'cols':'35','rows':'5','name':'email_message'}));
		col2.appendChild(new Element('br'));
		
		col2.appendChild(new Element('label').update('Include in email: '));
		var defaultInput = new Element('input',{'type':'radio','name':'results','value':'y'});
		defaultInput.defaultChecked = true; // IE Fix
		col2.appendChild(defaultInput);
		col2.appendChild(new Element('small').update(' Results &nbsp;&nbsp;'));
		col2.appendChild(new Element('input',{'type':'radio','name':'results','value':'n'}));
		col2.appendChild(new Element('small').update(' Link to this Page'));
		
		// Append Columns to Form
		form.appendChild(col1);
		form.appendChild(colSep);
		form.appendChild(col2);
		form.appendChild(new Element('br',{'class':'clear'}));
		
		// Hidden Elements
		form.appendChild(new Element('input',{'type':'hidden','name':'mailidentifier','value':this.trackingNumber}));
		form.appendChild(new Element('input',{'type':'hidden','name':'event_id','value':this.eventId}));
		form.appendChild(new Element('input',{'type':'hidden','name':'pickup','value':this.pickup}));
		form.appendChild(new Element('input',{'type':'hidden','name':'receivedate','value':this.receiveDate}));
		
		// Submit
		form.appendChild(new Element('br'));
		form.appendChild(this.button = new Element('input',{'type':'submit','value':'Submit'}));
		
		return form;
		
	},
	
	isValid: function(){
		
		var validate = new FormValidator(this.form,{
			'settings':{
				'messageType':'label,alert',
				'closeLinkText':''
			},
			'rules':{
				'from_name':{'required':true},
				'from_email_address':{'required':true,'type':'email'},
				'to_email_address':{'required':true,'type':'emailList'}
			}
		});
		
		validate.start();
		
		return validate.isValid;
		
	}

});

WebTrack.Updates = Class.create({

	initialize: function(parent,trackingNumber,eventId,pickup,receiveDate){
		
		this.addressCnt		= 0;
		this.trackingNumber	= trackingNumber;
		this.eventId		= eventId;
		this.parent			= parent;
		this.pickup			= pickup;
		this.receiveDate	= receiveDate;
		this.emails			= new Array();
		this.form			= this.buildForm();
		this.element		= this.buildElement();
		this.limit			= -1; // -1 = unlimited
		
		this.listen();
		this.launch();
		
	},
	
	launch: function(){
		
		this.modal = new Modal(this.element,{'showclose':true,'width':'375px','dropzone':'center-rail','blockbackground':true});
		this.modal.openBox();
		
		this.form.focusFirstElement();
		
	},
	
	listen: function(){
		
		this.form.observe('submit',this.processForm.bindAsEventListener(this));
		
	},
	
	processForm: function(event){
		
		Event.stop(event);
		
		var serForm = this.form.serialize(true);
		var emailStr = serForm.email;
		
		if(typeof serForm.email == "object"){
			
			emailStr = '';
			serForm.email.each(function(value,i){
			
				emailStr += (i == 0)?value:',' + value;
				
			},this);
			
		}
		
		if(this.isValid(emailStr)){
			
			this.button.disable();
			
			var url = "json/webtrack.cfm?method=createEmailNotification";
				url += "&email=" + emailStr;
				url += "&trackingnumber=" + serForm.trackingnumber;
				url += "&lastevent_id=" + serForm.lasteventid;
				url += "&pickup=" + serForm.pickup;
				url += "&receivedate=" + serForm.receivedate;
				
			new AjaxRequest(url,this._processFormOnSuccess.bind(this));
			
		}else{
			
			alert('Please enter a valid e-mail address(es).');
			
		}
		
	},
	
	_processFormOnSuccess: function(response){
		
		if(response.results.STATUS == 1){
			
			this.modal.closeBox();
			
			var content = new Element('div');
				content.appendChild(new Element('h2',{'class':'green'}).update('Success!'));
				content.appendChild(new Element('span').update(response.results.MESSAGE));
			
			new Modal(content,{'dropzone':'center-rail','showclose':true}).openBox();
			
		}else{
			
			this.button.enable();
			
			alert('An error has occurred:\n' + response.results.MESSAGE);
			
		}
		
	},
	
	addEmail: function(event){
		
		Event.stop(event);
		
		if(this.limit == -1 || (this.addressCnt+1) < this.limit){
		
			var element = event.element();
			
			this.hideRemoveLink();
			
			this.addressCnt++;
			
			this.emails[this.addressCnt] = this.buildEmailElement(true);
			
			element.insert({before:this.emails[this.addressCnt]});
		
		}
		
		// Check for e-mail limit -- hide if over or equal to
		if((this.addressCnt+1) >= this.limit && this.limit != -1){
			this.addLink.hide();
		}
		
		// Try to focus on new email input box
		try{ this.emails[this.addressCnt].down('input').focus(); }catch(err){}
		
	},
	
	removeEmail: function(event){

		this.emails[this.addressCnt].remove();
		
		this.addressCnt--;
		
		// Try to focus on previous email input box
		try{ this.emails[this.addressCnt].down('input').focus(); }catch(err){}
		
		this.showRemoveLink();
		
		// Check for e-mail limit -- show if under
		if((this.addressCnt+1) < this.limit || this.limit != -1){
			this.addLink.show();
		}
		
	},
	
	buildElement: function(){
		
		var content = new Element('div');
		
		content.appendChild(new Element('h1',{'class':'modal_hd'}).update('Sign-Up For E-Mail Updates'));
		content.appendChild(this.form);
		
		return content;
		
	},
	
	buildForm: function(){
		
		var form = new Element('form');
		
		this.emails[this.addressCnt] = this.buildEmailElement();
		form.appendChild(this.emails[this.addressCnt]);
		
		// Add another link
		form.appendChild(this.addLink = new Element('a',{'href':'javascript:void(0)','class':'small add-link'}).observe('click',this.addEmail.bindAsEventListener(this)).update('Add E-Mail Address'));
		
		// Tracking Number
		form.appendChild(new Element('input',{'type':'hidden','name':'trackingnumber','value':this.trackingNumber}));
		
		// Last Event Id
		form.appendChild(new Element('input',{'type':'hidden','name':'lasteventid','value':this.eventId}));
		
		// Pickup Number
		form.appendChild(new Element('input',{'type':'hidden','name':'pickup','value':this.pickup}));
		
		// Receive Date
		form.appendChild(new Element('input',{'type':'hidden','name':'receivedate','value':this.receiveDate}));
		
		form.appendChild(new Element('br'));
		form.appendChild(this.button = new Element('input',{'type':'submit','value':'Sign Up'}));
		
		return form;
		
	},
	
	buildEmailElement: function(showRemove){
		
		var div = new Element('div',{'class':'email-updates'}); 
		
		div.appendChild(new Element('label').update('E-Mail Address ' + (this.addressCnt+1) + ':'));
		div.appendChild(new Element('input',{'name':'email','type':'text','size':'25'}));
		
		if(showRemove){
			
			div.appendChild(new Element('a',{'href':'javascript:void(0)','class':'small remove-link'}).observe('click',this.removeEmail.bindAsEventListener(this,this.addressCnt)).update('Remove'));
			
		}
		
		div.appendChild(new Element('br',{'class':'clear'}));
		
		return div;
		
	},
	
	showRemoveLink: function(){
		
		try{ this.emails[this.addressCnt].down('a').show(); }catch(err){}
		
	},
	
	hideRemoveLink: function(){
		
		try{ this.emails[this.addressCnt].down('a').hide(); }catch(err){}
		
	},
	
	isValid: function(emailStr){
			
		return this.emailList(emailStr);
		
	},
	
	emailList: function(e){ var f=/^[A-Z0-9\._%-]+@[A-Z0-9\.-]+\.[A-Z]{2,4}(?:[,;][A-Z0-9\._%-]+@[A-Z0-9\.-]+\.[A-Z]{2,4})*$/i; return ((f.test(e))); }


});

WebTrack.Paging = Class.create({

	initialize: function(parent,element,page,isOpen){
		
		this.parent		= parent;
		this.element	= element;
		this.page		= page;
		this.isOpen		= (isOpen)?isOpen:false;
		this.resultOn	= 0;
		this.results	= new Array();
		
		this.loadElements();
		
		this.loadControls();
		
		this.loadResults();
		
	},
	
	gotoNextPage: function(event){
		
		Event.stop(event);
		
		this.parent.gotoPage(this.page+1);
		
	},
	
	gotoPrevPage: function(event){
		
		Event.stop(event);
		
		this.parent.gotoPage(this.page-1);
		
	},
	
	hidePage: function(){
		
		this.element.hide();
		
	},
	
	showPage: function(){
		
		this.element.show();
		
	},
	
	loadControls: function(){
		
		// Prev Link
		try{ this.prevLink.observe('click',this.gotoPrevPage.bindAsEventListener(this)); }catch(err){ /* Prev link disabled */ }
		
		// Next Link
		try{ this.nextLink.observe('click',this.gotoNextPage.bindAsEventListener(this)); }catch(err){ /* Next link disabled */ }
		
	},
	
	loadElements: function(){
		
		// Prev Link
		this.prevLink	= this.element.down('.prev-link');
		
		// Next Link
		this.nextLink	= this.element.down('.next-link');
		
	},
	
	loadResults: function(){
		
		var results = this.element.select('.result');
		
		results.each(function(element,i){
		
			this.results[i] = new WebTrack.Result(this,element);
		
		},this);
		
	}

});

WebTrack.Result = Class.create({

	initialize: function(parent,element){
		
		this.parent			= parent;
		this.grand			= this.parent.parent; // parent's parent class (grandparent?)
		this.element		= element;
		this.linkElm		= element.down('a');
		this.mailId			= this.linkElm.getAttribute('data-mailidentifier');
		this.classId		= this.linkElm.getAttribute('data-class_id');
		this.delconFlag		= this.linkElm.getAttribute('data-delcon_flag');
		this.eventId		= this.linkElm.getAttribute('data-event_id');
		this.pickup			= this.linkElm.getAttribute('data-pickup');
		this.requestType 	= this.linkElm.getAttribute('data-request_type');
		this.receiveDate	= this.linkElm.getAttribute('data-receivedate');
		this.dataId			= 'tn_' + this.mailId;
		this.container		= this.grand.detailContainer;
		
		this.linkElm.observe('click',this.showTrackingData.bindAsEventListener(this));
		
	},
	
	showLoader: function(){
		
		this.loader = new Element('div',{'class':'loader'});
		
		this.loader.style.height	= this.element.getHeight() + 'px';
		this.loader.style.width		= this.element.getWidth() + 'px';
		
		this.element.appendChild(this.loader);
		
	},
	
	showTrackingData: function(event){
		
		Event.stop(event);
		
		this.grand.cleanResultsClasses();
		
		this.linkElm.addClassName('on');
		
		try{
			
			var test = $(this.dataId);
			
			if(test){
				
				this.grand.hideActive();
				
				test.show();
				
				this.grand.updateTrackingNumber(this.mailId,this.eventId,this.delconFlag,this.classId,this.pickup,this.receiveDate);
				
			}else{
				
				throw('load data');
				
			}
			
		}catch(err){
			
			this.showLoader();
			
			this.loadTrackingData();
			
		}
		
	},
	
	loadTrackingData: function(){
		
		var url = 'json/webtrack.cfm?method=getTrackingDetails&trackingnumber=' + this.mailId + '&request_type=' + this.requestType;
		
		new AjaxRequest(url,this._loadTrackingDataOnSuccess.bind(this));
		
	},
	
	_loadTrackingDataOnSuccess: function(response){
		
		this.grand.hideActive();
		
		var div = new Element('div',{'id':this.dataId,'class':'tracking-body'}).update(response.results.CURRENTSTATUS + response.results.TRACKINGHISTORY + response.results.PACKAGEDETAILS);
		
		this.container.appendChild(div);
		
		this.loader.remove();
		
		this.grand.updateTrackingNumber(this.mailId,response.results.EVENT_ID,response.results.DELCON_FLAG,this.classId,this.pickup,this.receiveDate);
		
	}
});