// WebTrack Class
//   :: Purpose: controls webtrack events
//   :: Developed by: Mike Stumhofer
//   :: Date: 6/4/2008
//   :: Additional Classes Defined:  TrackingResults, ResultsPage, TrackingItem
//   :: Required Files:
//         js.utility.dateFormat
//         js.dom_html
//   :: Updated: 8/27/2008 - SG

var validatorSettings = {
	'error_display_type':		'box', // (box,alert,labelonly) = box (popup displayed near form element and adds error class to label), alert (javascript alert and adds error class to label), labelonly (adds error class to label)
	'error_scrollto':			false, // scroll to first form element with an error
	'error_scrollto_duration':	1.2, // Scroll duration in seconds
	'error_scrollto_offset':	-25,	// Scroll offset in pixels
	'validator_class':			'require', // class given to form element(s) for validation
	'validator_form_class':		'validate', // class given to form to trigger validation
	'error_class':				'validation-error', // class given to label or form element (if label does not exist)
	'error_box_class':			'validation-error-box', // class given to error box div
	'error_label_position':		'top', // 'top' = label is stacked on top of form element; 'left' = label is to the left of the form element
	'error_message_start':      'We have found the following error(s):',
	'error_message_end':        'Please check the fields and try again.',
	'error_message_default':	'This field is required.',
	'error_message_empty':		'Some required values are not correct. Please check the fields and try again.'
}

function WebTrack() {
	
	// _webTrackConfig.detailDiv
	// _webTrackConfig.searchDiv
	// _webTrackConfig.searchTabDiv
	// _webTrackConfig.resultsDiv
	// _webTrackConfig.resultsTabDiv
	// _webTrackConfig.loadingDiv
	// _webTrackConfig.usps_link
	
	this.pieceBrowser;
	
	WebTrack.prototype.init = function(firstResult,totalResults,maxResults) {
		
		this.pieceBrowser = new TrackingResults();
		this.pieceBrowser.init(firstResult,totalResults,maxResults);
		
	}
	
	// AJAX callbacks
	WebTrack.prototype.loadPiece = function(r) {
		
		WebTrackEvents.pieceBrowser.resultParse(r);
		
	}
	
	// other functions
	WebTrack.prototype.validate = function() {
		
		if (document.tracking.trackingnumber.value == '') {
			
			alert('Please enter a tracking number to search.');
			return false;
			
		} else {
		
			return true;
		
		}
	}
	
	WebTrack.prototype.trackWaybill = function(waybill) {
		
		document.frmDHLwaybillLink.txtTrackNbrs.value = waybill;
		document.frmDHLwaybillLink.submit();
		
	}
	
	WebTrack.prototype.toggleSearch = function() {
		
		var searchEl = document.getElementById(_webTrackConfig.searchDiv);
		var searchTabEl = document.getElementById(_webTrackConfig.searchTabDiv);
		var resultsEl = document.getElementById(_webTrackConfig.resultsDiv);
		var resultsTabEl = document.getElementById(_webTrackConfig.resultsTabDiv);
		
		if (searchEl.className == 'hide') { 
		
			searchEl.className = '';
			searchTabEl.className = 'on';
			resultsEl.className = 'hide';
			resultsTabEl.className = '';
			
		} else {
			
			searchEl.className = 'hide';
			searchTabEl.className = '';
			resultsEl.className = '';
			resultsTabEl.className = 'on';
			
		}
		
	}
	
}



function TrackingResults() {
	
	this.activePiece;
	this.maxResults;
	
	this.results;
	
	this.init = function(activePiece,totalResults,maxResults) {
		
		this.setActive(activePiece);
		this.maxResults = maxResults;
		
		this.results = new ResultsPaging;
		this.results.init(1,totalResults,maxResults);
		
	}
	
	this.showResult = function(trackingnumber) {
		
		this.makeInactive(this.activePiece);
		this.makeActive(trackingnumber);
		
		try {
		
			this.hidePiece(this.activePiece);
			this.showPiece(trackingnumber);
			
		} catch(err) {
			
			this.showLoading();
			this.getResultData(trackingnumber);
			
		}
		
		this.setActive(trackingnumber);
		
	}
	
	this.resultParse = function(r) {
		
		if (r[1] == 'success') {
			
			var piece = new TrackingItem();
			piece.init(r[0]);
			
			piece.parseResults(r[2]);
			
			this.hideLoading();
			
			this.showPiece(r[0]);
			
		} else {
			
			alert(r[1]);	
			
		}
		
	}
	
	// private methods
	this.getResultData = function(trackingnumber) {
		
		DWREngine._execute(_ajaxConfig._cfscriptLocation, null, 'getTrackingResult', trackingnumber, WebTrackEvents.loadPiece);
		
	}
	
	this.makeActive = function(trackingnumber) {
		
		var pieceEl = $('result_'+trackingnumber);
		pieceEl.className = 'on';
		
	}
	
	this.makeInactive = function(trackingnumber) {

		var pieceEl = $('result_'+trackingnumber);
		pieceEl.className = '';
		
	}
	
	this.showPiece = function(trackingnumber) {

		var pieceEl = document.getElementById(trackingnumber);
		pieceEl.className = 'show';
		
	}
	
	this.hidePiece = function(trackingnumber) {
		
		var pieceEl = document.getElementById(trackingnumber);
		pieceEl.className = 'hide';
		
	}
	
	this.showLoading = function() {
		
		var loadingEl = document.getElementById(_webTrackConfig.loadingDiv);
		loadingEl.className = 'loader show';
		
	}
	
	this.hideLoading = function() {
		
		var loadingEl = document.getElementById(_webTrackConfig.loadingDiv);
		loadingEl.className = 'hide';
		
	}
	
	this.setActive = function(trackingnumber) {
		
		this.activePiece = trackingnumber;	
		
	}
	
	
}


// ResultsPaging Class
// Handles paging through the results pages

function ResultsPaging() {
	
	this.currentPage;
	this.totalPages;
	// _webTrackConfig.prev_link
	// _webTrackConfig.next_link
	
	this.init = function(currentPage,totalResults,maxPageResults) {
		
		this.currentPage = currentPage;
		this.setTotalPages(totalResults,maxPageResults);
		
	}
	
	this.nextPage = function() {
		
		var nextPage = this.currentPage + 1;
		
		if (nextPage <= this.totalPages) {
		
			this.changePage(nextPage);
			
		}
	}
	
	this.prevPage = function() {
		
		var nextPage = this.currentPage - 1;
		
		if (nextPage > 0) {
		
			this.changePage(nextPage);
			
		}
	}
	
	this.gotoPage = function(pageNum) {
		
		if (pageNum != this.currentPage) {
		
			this.changePage(pageNum);
			
		}
	}
	
	this.changePage = function(next) {
		
		//alert('current: '+this.currentPage+'\nnext: '+next);
		
		this.hidePage(this.currentPage);
		this.togglePageLink(this.currentPage);
			
		this.showPage(next);
		this.togglePageLink(next);
		this.togglePrevLink(next);
		this.toggleNextLink(next);
			
		this.currentPage = next;
		
	}
	
	this.showPage = function(pageNum) {
		
		var thePage = $('results_'+pageNum);
		thePage.className = 'results-bar tracking-box show';
		
	}
	
	this.hidePage = function(pageNum) {
		
		var thePage = $('results_'+pageNum);
		thePage.className = 'results-bar tracking-box hide';
		
	}
	
	this.togglePageLink = function(pageNum) {
		
		var pageEl = $('pagelink_'+pageNum);
		
		if (pageEl.className == 'paging-inactive') {
			
			pageEl.className = 'paging-active';
			
		} else {
			
			pageEl.className = 'paging-inactive';
			
		}
		
	}
	
	this.togglePrevLink = function(pageNum) {
		
		var prevEl = $(_webTrackConfig.prev_link);
		
		if (pageNum == 1) {
			
			prevEl.className = 'paging-inactive';
			
		} else {
			
			prevEl.className = 'paging-active';
			
		}
		
	}
	
	this.toggleNextLink = function(pageNum) {
		
		var nextEl = $(_webTrackConfig.next_link);
		
		if (pageNum == this.totalPages) {
			
			nextEl.className = 'paging-inactive';
			
		} else {
			
			nextEl.className = 'paging-active';
			
		}
		
	}
	
	this.setTotalPages = function(totalResults,maxResults) {
		
		var total = Math.ceil(totalResults/maxResults);
		
		this.totalPages = total;
		
	}
	
}

// TrackingItem Class
// Creates the DOM elements to display tracking data for one mail piece

function TrackingItem() {
	
	this.trackingnumber;
	
	this.init = function(trackingnumber) {
		
		this.trackingnumber = trackingnumber;
		
	}
	
	this.parseResults = function(r) {
		
		returnFrag = document.createDocumentFragment();
		
		returnFrag.appendChild(this.createHtml(r));

		this.addToDom(returnFrag);
		
	}
	
	this.addToDom = function(frag) {

		var holder = $(_webTrackConfig.detailDiv);

		holder.appendChild(frag);
		
	}
	
	this.createHtml = function(r) {
		
		var container = new Element('div',{'class':'hide','id':this.trackingnumber});
		
		//var container = createDiv('hide',this.trackingnumber);
		
		container.appendChild(this.formatStatusBox(r));
		
		container.appendChild(this.formatTrackHist(r));
		
		container.appendChild(this.formatShipDetails(r));
		
		return container;
		
	}
	
	// Format the Shipment Details area
	this.formatShipDetails = function(r) {
		
		/*
		<div class="tracking-box">
			<div class="tracking-hd">Shipment Details</div>
			<ul id="tracking_details_col">
				<li class="tracking-details-col">
					<strong>Shipped To</strong><br>
					140 W 30TH ST<br>
					RM 3E<br>
					NEW YORK, NY 10001-4005
				</li>
				<li class="tracking-details-col">
					<div class="tracking_details_results"><strong>Ship Date</strong><br>9/18/2008</div>
					<div class="tracking_details_results"><strong>Total Weight</strong><br>0.5401 lbs</div>
					<div class="tracking_details_results"><strong>Service</strong><br>SM Parcels Expedited</div>
				</li>
				<li class="tracking-details-col">
					<div class="tracking_details_results"><strong>DHL GM</strong><br>133240659-1902-0908</div>
				</li>
			</ul><br class="clear">
			<div class="tracking-details-time bold">Tracking Details as of 12/2/2008 - 04:19 PM  ET</div>
		</div>
		*/
		
		var cont = new Element('div',{'class':'tracking-box'});
		
		cont.appendChild(new Element('div',{'class':'tracking-hd'}).update('Shipment Details'));
		
		//var listEl = createList('','tracking_details_col');
		
		var listEl = new Element('ul',{'id':'tracking_details_col'});
		
		listEl.appendChild(this.addressDetails(r.city[0],r.state[0],r.zip[0],r.address1[0],r.address2[0]));
		
		listEl.appendChild(this.packageDetails(r.weight[0],r.servicename[0]));
		
		listEl.appendChild(this.numberDetails(r.trackingnumber[0],r.customerconfirm[0],r.delivery_confirm[0]));
		
		cont.appendChild(listEl);
		
		cont.appendChild(this.clearBr());
		
		cont.appendChild(this.timeStamp());
		
		return cont;
		
	}
	
	this.addressDetails = function(city,state,zip,add1,add2) {
		
		/*
		<li class="tracking-details-col">
			<strong>Shipped To</strong><br />
			MORGANTOWN, WV 26505 
		</li>
		*/
		
		var listItem = new Element('li',{'class':'tracking-details-col'});
		
		var headerItem = new Element('strong').update('Shipped To');
		
		listItem.appendChild(headerItem);
		
		listItem.appendChild(new Element('br'));
		
		if (add1 != null) { 
		
			listItem.appendChild(document.createTextNode(add1));
			listItem.appendChild(new Element('br'));
			
		}
		
		if (add2 != null) { 
		
			listItem.appendChild(document.createTextNode(add2));
			listItem.appendChild(new Element('br'));
			
		}
		
		listItem.appendChild(document.createTextNode(city+', '+state+' '+zip));
		
		return listItem;
		
	}
	
	this.packageDetails = function(weight,product) {
		
		/*
		<li class="tracking-details-col">
			<strong>Ship Date</strong><br />
				5/2/2008<br />
			<strong>Total Weight</strong><br />
				0.2155 lbs<br />
			<strong>Service</strong><br />
				SM Parcels Expedited
		</li>

		*/
		
		var listItem = new Element('li',{'class':'tracking-details-col'});
		
		listItem.appendChild(this.createDetailItem('Total Weight',weight+' lbs.'));
		listItem.appendChild(new Element('br'));
		listItem.appendChild(this.createDetailItem('Service',product));
		
		return listItem;
		
	}
	
	this.numberDetails = function(track,cust,delcon) {
		
		/*
		<li class="tracking-details-col">
			<strong>DHL GM</strong><br />
				080458368-0302-0508
			<strong>Customer Reference</strong><br />
				00012345678967151320
			<strong>USPS Delivery Confirmation</strong>
				9102557033532067261492
		</li>
		*/
		
		var listItem = new Element('li',{'class':'tracking-details-col'});
		
		listItem.appendChild(this.createDetailItem('DHL GM',track));
		listItem.appendChild(new Element('br'));
		if (cust != null) {
			listItem.appendChild(this.createDetailItem('Customer Reference',cust));
			listItem.appendChild(new Element('br'));
		}
		if (delcon != null) {
			listItem.appendChild(this.createDelConItem(delcon));
			listItem.appendChild(new Element('br'));
		}
		/*if (waybill != null) {
			listItem.appendChild(this.createWaybillItem(waybill))
		}*/
		
		return listItem;
		
	}
	
	this.createDetailItem = function(header,value) {
		
		/*
		<strong>HEADER</strong><br />VALUE
		*/
		
		var itemFrag = document.createDocumentFragment();
		
		var headEl = new Element('strong').update(header);
		
		itemFrag.appendChild(headEl);
		itemFrag.appendChild(new Element('br'));
		itemFrag.appendChild(document.createTextNode(value));
		
		return itemFrag;
		
	}
	
	this.createWaybillItem = function(waybill) {
		
		var waybillLink = new Element('a',{'href':'#'}).update(waybill);
		//waybillLink.appendChild(document.createTextNode(waybill));
		//waybillLink.href = '#';
		waybillLink.onclick = function() { WebTrackEvents.trackWaybill(waybill) };		
		
		var itemFrag = document.createDocumentFragment();
		
		var headEl = new Element('strong').update('DHL @home');
		
		itemFrag.appendChild(headEl);
		itemFrag.appendChild(document.createElement('br'));
		itemFrag.appendChild(waybillLink);
		
		return itemFrag;
		
	}
	
	this.createDelConItem = function(delcon) {
		
		var delconLink = new Element('a',{'href':_webTrackConfig.usps_link+delcon,'target':'_blank'}).update(delcon);
		
		var itemFrag = document.createDocumentFragment();
		
		var headEl = new Element('strong').update('USPS Delivery Confirmation');
		
		itemFrag.appendChild(headEl);
		itemFrag.appendChild(document.createElement('br'));
		itemFrag.appendChild(delconLink);
		
		return itemFrag;
		
	}
	
	this.timeStamp = function() {
		
		var now = new Date();
		
		var stampEl = new Element('div',{'class':'tracking-details-time bold'}).update('Tracking Details as of '+now.format('m/d/yyyy')+' - '+now.format('longTime'));
		
		return stampEl;
		
	}
	
	// Format the Tracking History area
	this.formatTrackHist = function(r) {
		
		/*
		<div id="tracking_history" class="tracking-box">
			<div class="tracking-hd">Tracking History</div>
			<table id="tracking_table" width="100%" border="0" cellpadding="0" cellspacing="0">
				<thead>
				<tr>
					<th class="date">Date</th>
					<th class="time">Time</th>
					<th>Location</th>
					<th>Activity</th>
				</tr>
				</thead>
				<tbody>
				<tr>
					<td class="bold">7/10/2008</td>
					<td class="bold">09:49 AM ET</td>
					<td class="bold">NEW YORK, NY</td>
					<td class="bold">DELIVERED</td>
				</tr>
				<tr class="alt">
					<td>7/9/2008</td>
					<td>02:59 PM ET</td>
					<td>JERSEY CITY, NJ</td>
					<td>ENROUTE</td>
				</tr>				
				</tbody>
			</table>
		</div>
		*/
		
		var cont = new Element('div',{'class':'tracking-box'});
		
		var boxHead = new Element('div',{'class':'tracking-hd'}).update('Tracking History');
		
		cont.appendChild(boxHead);
		
		//var cont = createDiv('tracking_box');
		
		//var boxHead = createDiv('tracking_details_hd padding10');
		//boxHead.appendChild(document.createTextNode('Tracking History'));
		
		//cont.appendChild(boxHead);
		
		//var trackList = document.createElement('ul');
		//trackList.id = 'tracking_table';
		
		var trackList = new Element('table',{'id':'tracking_table','width':'100%','cellspacing':'0','cellpadding':'0','border':'0'});

		//var trackList = document.createElement('table');
		//trackList.id = 'tracking_table';
		//trackList.setAttribute('width','100%');
		//trackList.cellSpacing = 0;
		//trackList.cellPadding = 0;
		
		var t = r.getRowCount();
		var sp;
		var rowClass;
		
		// Append Table header
		trackList.appendChild(this.histHeader());
		
		var trackContainer = new Element('tbody');
		
		for (i=0;i<t;i++) {
			
			sp=(i == 0)?'first':'reg';
			rowClass=(i % 2 == 0)?'':'alt';
			
			trackContainer.appendChild(this.histRow(r.event_date[i],r.time_zone[i],r.event_city[i],r.event_state[i],r.event_description[i],sp,rowClass));
			
		}

		trackList.appendChild(trackContainer);

		cont.appendChild(trackList);
		
		return cont;
		
	}
	
	this.clearBr = function() {
		
		var clearBr = document.createElement('br');
		clearBr.style.clear = 'both';
		
		return clearBr;
		
	}
	
	this.clearDetails = function() {
		
		var frag = document.createDocumentFragment();
		
		var browser=navigator.appName;
		var b_version=navigator.appVersion;
		var version=parseFloat(b_version);
		
		frag.appendChild(this.clearBr());
		
		if (b_version.search('MSIE 7.0') != -1) {
		
			var ieClear = document.createElement('div');
			ieClear.style.fontSize = '0px';
			ieClear.appendChild(document.createTextNode('\u00A0'));
			
			frag.appendChild(ieClear);
			
		} 
		
		return frag;
		
	}
	
	this.histHeader = function() {
		
		var returnFrag = new Element('thead');
		var rowFrag = new Element('tr');
		
		var sp = 'header';
		
		rowFrag.appendChild(this.histItem('date','Date',sp,'date'));
		rowFrag.appendChild(this.histItem('time','Time',sp,'time'));
		rowFrag.appendChild(this.histItem('location','Location',sp));
		rowFrag.appendChild(this.histItem('activity','Activity',sp));
		
		returnFrag.appendChild(rowFrag);
		
		return returnFrag;
		
	}
	
	this.histRow = function(date,zone,city,state,activity,sp,rowClass) {
		
		//var returnFrag = document.createDocumentFragment();
		var returnFrag = new Element('tr');
		if(rowClass){ returnFrag.className = rowClass; }
		
		returnFrag.appendChild(this.histItem('date',date.format('m/d/yyyy'),sp));
		returnFrag.appendChild(this.histItem('time',date.format('shortTime')+' '+zone,sp));
		returnFrag.appendChild(this.histItem('location',city+', '+state,sp));
		returnFrag.appendChild(this.histItem('activity',activity,sp));
		
		return returnFrag;
		
	}
	
	this.histItem = function(type,text,sp,itemClass) {
		
		var trackItem;
		
		/*trackItem = document.createElement('li');
		
		if (sp == 'header') { trackItem.className = type + ' table-hd'} 
		else if (sp == 'first') { trackItem.className = type + ' bold' } 
		else { trackItem.className = type }*/
		
		if(sp == 'header'){
			trackItem = document.createElement('th');
			if(itemClass){ trackItem.className = itemClass; }
		}else if(sp == 'first'){
			trackItem = document.createElement('td');
			trackItem.className = 'bold';
		}else{
			trackItem = document.createElement('td');	
		}
		
		trackItem.appendChild(document.createTextNode(text));
		
		return trackItem;
		
	}
	
	
	// Format the status area, and related methods
	this.formatStatusBox = function(r) {
		
		/* 
		<div class="tracking_status transit"> <span>Package Status for <strong>"080458368-0302-0508"</strong> is:</span><br />
		ENROUTE
		<div>in WARRENDALE, PA on 
		5/8/2008 at 01:47 ET</div>
		</div>
		*/
		
		var statusClass = 'tracking-box tracking-status ' + this.getTrackingStatus(r.event_id[0]);
		var statusBox = new Element('div',{'class':statusClass});
		
		var trackNumCont = new Element('strong').update(this.trackingnumber);
		
		var textCont = new Element('span');
		
		textCont.appendChild(document.createTextNode('Package Status for '));
		textCont.appendChild(trackNumCont);
		textCont.appendChild(document.createTextNode(' is:'));
		
		statusBox.appendChild(textCont);
		statusBox.appendChild(document.createElement('br'));
		statusBox.appendChild(document.createTextNode(r.event_description[0]));
		
		var eventCont = new Element('div');
		eventCont.appendChild(document.createTextNode('in '));
		eventCont.appendChild(document.createTextNode(r.event_city[0]+', '+r.event_state[0]));
		eventCont.appendChild(document.createTextNode(' on '));
		eventCont.appendChild(document.createTextNode(r.event_date[0].format('m/d/yyyy')));
		eventCont.appendChild(document.createTextNode(' at '));
		eventCont.appendChild(document.createTextNode(r.event_date[0].format('shortTime')));
		eventCont.appendChild(document.createTextNode(' '+r.time_zone[0]));
		
		statusBox.appendChild(eventCont);
		
		return statusBox;
		
	}
	
	this.getTrackingStatus = function(event_id) {
		
		var returnStatus;
		
		if (event_id == 100) { returnStatus = 'processed' }
		else if (event_id == 600) { returnStatus = 'delivered' }
		else if (event_id < 600) { returnStatus = 'transit' }
		else if (event_id > 600) { returnStatus = 'exception' }
		
		return returnStatus;
		
	}
	
}