/**
 * Python Exhaust Javascript
 */

var python = {};
var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
var Net = YAHOO.util.Connect;
var Anim = YAHOO.util.Anim;
var path = null;
var timeout;

// Map Variables
var map;
var xMap;
var points = [];
var markers = [0,0,0,0,0];

/**
 * Python Constructor
 */
python.main = function() {
	if(Dom.get('product_nav')) {
		Event.on('product_nav', 'click', python.handleProductClick);
	}
	if(Dom.get('dealer_results')) {
		Event.on('dealer_results', 'click', python.handleDealerClick);
	}
	if(Dom.get('map_canvas')) {
		python.loadGoogleMaps();
	}
	if(Dom.get('flash')) {
		python.setFlashHeader();
	}
	if(Dom.get('flash_sidebar')) {
		python.setFlashSidebar();
	}
	if(Dom.get('imageThumbContainer')) {
		Event.on('imageThumbContainer', 'click', python.handleImageClick);
	}
	if(Dom.get('addToFavorites')){
		python.setAddToFavorites();
	}
	if(Dom.get('galleryAdmin')) {
		Event.on('galleryAdmin', 'click', python.handleGalleryAdminClick);
		Event.on('galleryAdmin', 'click', python.handleGalleryImageClick);
	}
	if(Dom.get('gallery')) {
		Event.on('gallery', 'click', python.handleGalleryImageClick);
	}
}

python.handleProductClick = function(e) {
	var target = Event.getTarget(e);
	var sibling = Dom.getNextSibling(target);
	var style = Dom.getStyle(sibling, 'display');
	var clear = function(ul) {
		Dom.setStyle(ul, 'display', 'none');
	}
	var clearClass = function(a) {
		Dom.removeClass(a, 'active');
	}
	
	if(sibling !== null) {
		if(Dom.hasClass(sibling, 'sub_menu')) {
			var prev = Dom.getPreviousSibling(sibling);
			Dom.getElementsByClassName('sub_menu', 'ul', 'product_nav', clear);
			Dom.getElementsByClassName('active', 'a', 'product_nav', clearClass);
			Dom.setStyle(sibling, 'display', 'block');
			Dom.addClass(prev, 'active');
			Event.stopEvent(e);
		}		
	} 
	
	if(style == 'block') {
		clear(sibling);
		Event.stopEvent(e);
	}
}

python.handleImageClick = function(e) {
	var target = Event.getTarget(e);
	Event.stopEvent(e);
	if(Dom.hasClass(target, 'thumbImage')) {
		var img = {
			cat: target.id.split('_')[0],
			id: target.id.split('_')[1],
			rank: target.id.split('_')[2],
			old: Dom.getFirstChild(Dom.get('imageContainer'))
		}
				
		if(!Dom.get('imageOverlay')) {
			//console.log('creating overlay');
			var overlay = document.createElement('div');
			overlay.id = 'imageOverlay';
			overlay.style.backgroundColor = '#000';
			overlay.style.position = 'absolute';
			overlay.style.backgroundImage = "url('http://assets-static.lemansnet.com/sites/pythonperformance/img/ajax-loader.gif')";
			overlay.style.backgroundPosition = 'center';
			overlay.style.backgroundRepeat = 'no-repeat';
			Dom.get('imageContainer').appendChild(overlay);
		}
		
		Dom.setStyle('imageOverlay', 'display', 'block');
		Dom.setStyle('imageOverlay', 'opacity', '0.75');
		Dom.setStyle('imageOverlay', 'height', (Dom.get('imageContainer').offsetHeight - 5) + 'px');
		Dom.setStyle('imageOverlay', 'width', (Dom.get('imageContainer').offsetWidth - 5) + 'px');
		
		if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion < "7.0"){
			Dom.setStyle('imageOverlay', 'marginLeft', (-img.old.width - 5) + 'px');
		}else{
			Dom.setStyle('imageOverlay', 'marginTop', -img.old.height + 'px');
		}
		path = "showImage.jsp?image_type=fullsize&rank=" + img.rank + "&class_id=" + img.id;
		timeout = setTimeout("python.showImage()", 400);	
	}
}
		
python.showImage = function() {
	var timeoutId = timeout;
	clearTimeout(timeoutId);
	var imgUpdate = new Image();
	Event.on(imgUpdate, 'load', function() {
		//console.log('loaded');
		Dom.setStyle('imageOverlay', 'display', 'none');
		Dom.get('imageMain').src = imgUpdate.src; 
	});
	imgUpdate.src = path
	//console.log('fired listener');
}

python.setFlashHeader = function() {
	var flashvars = {};
	var params = { wmode: 'transparent' };
	var attributes = { wmode: 'transparent' };
	swfobject.embedSWF("/_assets/sites/pythonperformance/flash/python_header.swf", "flash", "750", "360", "9.0.0", false, flashvars, params, attributes);
}

python.setFlashSidebar = function() {
	var uri = window.location;
	var id = uri.search.split('&prod=')[1];
	
	var flashvars = {};
	var params = { flashvars: '&prod=' + id, wmode: 'transparent' };
	var attributes = { flashvars: '&prod=' + id, wmode: 'transparent' };
	swfobject.embedSWF("http://assets-static.lemansnet.com/sites/pythonperformance/flash/python_sidebar.swf?xmlid=" + id, "flash_sidebar", "150", "30", "9.0.0", false, flashvars, params, attributes);
}

python.setAddToFavorites = function() {
	var browser=navigator.appName.toLowerCase();
	if (browser.match('microsoft')){
		out = '<a href="javascript:window.external.AddFavorite(self.location,document.title)">Add to Favorites<\/a>';
	} else {
		var command = browser.match('opera') ? 'CTRL-T' : 'CTRL-D';
		out = command + ' to add bookmark';
	}
	Dom.get('addToFavorites').innerHTML = out;
}


python.preGalleryAjaxCall = function(target){
	var wrapper = Dom.get(target);
	var div = document.createElement('div');
	div.id = target + '_overlay';
	div.className = 'galleryoverlay';
	div.style.height = (Dom.get(target).offsetHeight - (Dom.get(target).style.paddingBottom).replace('px', '')) + 'px';
	div.style.width = Dom.get(target).offsetWidth + 'px';
	div.style.opacity = 0.8;
	div.innerHTML = "<div class='galleryajax' style='height: " + div.style.height + "'></div>";
	Dom.get(target).parentNode.insertBefore(div, Dom.get(target));
}


python.handleGalleryAdminClick = function(e) {
		
		
		handleSuccessAnimation = function(galleryId, itemId) {
			
				Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').innerHTML = '';
				
				var hideItem = new Anim(Dom.get('galleryWrapper_' + galleryId + "_" + itemId), {
					opacity: {
						from: 1,
						to: 0
					}
				}, 1, YAHOO.util.Easing.easeOut);
				
				var animation = new Anim(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'), {
					opacity: {
						from: 0.8,
						to: 0
					}
				}, 2, YAHOO.util.Easing.easeOut);
				
				var collapse = new Anim(Dom.get('galleryWrapper_' + galleryId + "_" + itemId), {
					height: {
						from: Dom.get('galleryWrapper_' + galleryId + "_" + itemId).offsetHeight,
						to: 0
					}
				}, 0.5);
				
				var removeItem = function() {
					Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').parentNode.removeChild(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'));
					Dom.get('galleryWrapper_' + galleryId + "_" + itemId).parentNode.removeChild(Dom.get('galleryWrapper_' + galleryId + "_" + itemId));
				}
				
				
				var doCollapse = function() {
					collapse.onComplete.subscribe(removeItem);
					collapse.animate();
				}
				
				hideItem.animate(); 
				animation.animate();
				animation.onComplete.subscribe(doCollapse);
		}
		
		handleFailureAnimation = function(galleryId, itemId) {
			
				Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').innerHTML = '';
				
				
				var animation = new Anim(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'), {
					opacity: {
						from: 0.8,
						to: 0
					}
				}, 2, YAHOO.util.Easing.easeOut);
				
				
				var removeItem = function() {
					Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').parentNode.removeChild(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'));
				}
				
				animation.animate();
				animation.onComplete.subscribe(removeItem);
		}
		
		handleSaveAnimation = function(galleryId, itemId) {
			
				Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').innerHTML = '';
				
				
				var animation = new Anim(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'), {
					opacity: {
						from: 0.8,
						to: 0
					}
				}, 2, YAHOO.util.Easing.easeOut);
				
				
				var removeItem = function() {
					Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').parentNode.removeChild(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'));
				}
				
				Dom.get('galleryItem_' + galleryId + '_' + itemId).innerHTML = "<p>Saved</p>";
				animation.animate();
				animation.onComplete.subscribe(removeItem);
		}
		
		handleApproved = {
			success: function(o) {
				o.responseText = YAHOO.lang.trim(o.responseText);
				if (o.responseText == 'success') {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#ACEFD4');
					handleSuccessAnimation(galleryId, itemId);
				} else {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
					handleFailureAnimation(galleryId, itemId);
				}
				
			},
			failure: function(o) {
				Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
				handleFailureAnimation(galleryId, itemId);
			}
		}
		
		handleDeleted = {
			success: function(o) {
				o.responseText = YAHOO.lang.trim(o.responseText);
				if (o.responseText == 'success') {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#ACEFD4');
					handleSuccessAnimation(galleryId, itemId);
				} else {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
					handleFailureAnimation(galleryId, itemId);
				}
				
			},
			failure: function(o) {
				Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
				handleFailureAnimation(galleryId, itemId);
			}
		}
		
		handleEdit = {
			success: function(o) {
				Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay').parentNode.removeChild(Dom.get('galleryWrapper_' + galleryId + "_" + itemId + '_overlay'));
				Dom.get('galleryItem_' + galleryId + "_" + itemId).innerHTML = o.responseText;
			},
			failure: function(o) {
				Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
				handleFailureAnimation(galleryId, itemId);
			}
		}
		
		handleSave = {
			success: function(o) {
				o.responseText = YAHOO.lang.trim(o.responseText);
				if (o.responseText == 'success') {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#ACEFD4');
					handleSaveAnimation(galleryId, itemId);
				} else {
					Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
					handleFailureAnimation(galleryId, itemId);
				}
			},
			failure: function(o) {
				Dom.setStyle('galleryWrapper_' + galleryId + "_" + itemId + '_overlay', 'backgroundColor', '#8F0404');
				handleFailureAnimation(galleryId, itemId);
			}
		}
		
		var target = Event.getTarget(e);
		var action = target.id.split('_')[0];
		if(action) {
			var galleryId = target.id.split('_')[1];
			var itemId = target.id.split('_')[2];
			var extension = target.id.split('_')[3];
			var postData = 'gallery_id=' + galleryId + '&item_id=' + itemId + '&extension=' + extension;
		}
		if(action == 'approveItem') {
			python.preGalleryAjaxCall('galleryWrapper_' + galleryId + '_' + itemId);
			Event.stopEvent(e);
			Net.asyncRequest('POST', 'inc/common/xhr/_approveGalleryItem.jsp', handleApproved, postData);
		} else if (action == 'deleteItem') {
			python.preGalleryAjaxCall('galleryWrapper_' + galleryId + '_' + itemId);
			Event.stopEvent(e);
			Net.asyncRequest('POST', 'inc/common/xhr/_deleteGalleryItem.jsp', handleDeleted, postData);
		} else if (action == 'editItem') {
			python.preGalleryAjaxCall('galleryWrapper_' + galleryId + '_' + itemId);
			Event.stopEvent(e);
			Net.asyncRequest('POST', 'inc/common/xhr/_editGalleryItem.jsp', handleEdit, postData);
		} else if (action == 'pendingItem') {
			python.preGalleryAjaxCall('galleryWrapper_' + galleryId + '_' + itemId);
			Event.stopEvent(e);
			Net.asyncRequest('POST', 'inc/common/xhr/_disapproveGalleryItem.jsp', handleApproved, postData);
		} else if (action == 'saveItem') {
			python.preGalleryAjaxCall('galleryWrapper_' + galleryId + '_' + itemId);
			Event.stopEvent(e);
				var formData = Dom.getElementsBy(function() {
					return this;
				}, 'input', Dom.get('galleryItem_' + galleryId + "_" + itemId));
				var formDescription = Dom.getElementsBy(function() {
					return this;
				}, 'textarea', Dom.get('galleryItem_' + galleryId + "_" + itemId));
				
				var saveData = 'gallery_id=' + galleryId + '&item_id=' + itemId + 
					'&galleryAuthor=' + formData[0].value + '&galleryTitle=' + formData[1].value +
					'&galleryDescription=' + formDescription[0].value;
				
				Net.asyncRequest('POST', 'galleryEdit.jsp', handleSave, saveData);
		}
		 
}

python.handleGalleryImageClick = function(e) {

	if (!Event.getTarget(e).id == 'gallerySubmit') {
		Event.stopEvent(e);
	}
	var xoffset = 0;
	var yoffset = 0;
	var tempX = 0;
	var tempY = 0;
	
	handleImageMove = function(e) {
		Event.stopEvent(e);
		var target = Event.getTarget(e);
		xoffset = e.clientX;
		yoffset = e.clientY;
		Event.on(document, 'mouseup', handleImageStop);
		Event.on(document, 'mousemove', handleImageDrag);	
	}
	
	handleImageDrag = function(e) {
		Event.stopEvent(e);
		tempX = e.clientX;
		tempY = e.clientY;
		var left = Dom.getStyle('gallery_popup', 'left');
		left = left.substr(0, left.length - 2);
		var top = Dom.getStyle('gallery_popup', 'top');
		top = top.substr(0, top.length - 2);
		Dom.get('gallery_popup').style.left = left - (xoffset - tempX) + 'px';
		Dom.get('gallery_popup').style.top = top - (yoffset - tempY) + 'px';
		xoffset = tempX;
		yoffset = tempY;
	}
	
	handleImageStop = function(e) {
		Event.removeListener(document, 'mousemove', handleImageDrag);
		Event.removeListener(document, 'mouseup', handleImageStop);
	}
	
	
	handleLoad = function(path) {

		var imgUpdate = new Image();
		Event.on(imgUpdate, 'load', function(){
			Dom.get('gallery_image').src = imgUpdate.src;
			var left = (Dom.getViewportWidth() / 2) - (imgUpdate.width / 2);
			var top = (Dom.getViewportHeight() / 2) - (imgUpdate.height / 2);
			top = top + Dom.getClientRegion().top;
			Dom.get('gallery_popup').style.left = parseInt(left, 10) + 'px';
			Dom.get('gallery_popup').style.top = parseInt(top, 10) + 'px';
			Event.on('gallery_popup', 'mousedown', handleImageMove);
		});
		imgUpdate.src = path;
		
		// Center Loading Image
		var left = (Dom.getViewportWidth() / 2) - (imgUpdate.width / 2);
		var top = (Dom.getViewportHeight() / 2) - (imgUpdate.height / 2);
		top = top + Dom.getClientRegion().top;
		Dom.get('gallery_popup').style.left = parseInt(left, 10) + 'px';
		Dom.get('gallery_popup').style.top = parseInt(top, 10) + 'px';
		Dom.get('gallery_close').style.marginLeft = -5 + 'px';
		Dom.get('gallery_close').style.marginTop = -5 + 'px';	
	}
	
	handleImageClose = function(e) {
		document.body.removeChild(Dom.get('gallery_popup'));
	}
	
	var target = Event.getTarget(e);
	var action = target.id.split('_')[0];
	if(action) {
		var galleryId = target.id.split('_')[1];
		var itemId = target.id.split('_')[2];
		var extension = target.id.split('_')[3];
		var postData = '?gallery_id=' + galleryId + '&item_id=' + itemId + '&extension=' + extension;
	}
	if(action == 'popImage') {
		Event.stopEvent(e);
		if(!Dom.get('gallery_popup')) {
			var div = document.createElement('div');
			var description = null;
			if(Dom.get('showDescription_' + itemId) != null) {
				description = Dom.get('showDescription_' + itemId).innerHTML;
			} else {
				description = '';
			}
			div.id = 'gallery_popup';
			div.style.position = 'absolute';
			div.innerHTML = 
				"<div id='gallery_close'>" +
				"<span>Close</span>" +
				"</div>" +
				"<img id='gallery_image' src='http://assets-static.lemansnet.com/sites/pythonperformance/img/ajax-loader.gif' alt='Gallery Image' />" +
				"<div class='gallery_desc'>" +
				description +
				"</div>";
			document.body.appendChild(div);
			handleLoad(target.parentNode.href);
			Event.on('gallery_close', 'click', handleImageClose);	
		}
		
	}
}


/**
 * GOOGLE MAPS FUNCTIONALITY
 */

python.handleDealerClick = function(e) {
	var target = Event.getTarget(e);
	if(Dom.hasClass(target, 'pan')) {
		var id = target.id.split('_')[1];
		if(gmap_dealers[id].point) {
			map.setZoom(15);
			map.panTo(gmap_dealers[id].point);
			GEvent.trigger(markers[id], "click");
		}
		Event.stopEvent(e);
	}
}

python.loadGoogleMaps = function() {
  if (GBrowserIsCompatible()) {
		window.unload = GUnload();
		map = new GMap2(document.getElementById("map_canvas"));
		var offset = { x: -28, y: -125 };
		var anchor = { x: 0, y: -20 };
		xMap = new xMap(anchor, offset);
		map.addOverlay(xMap);
		
		var geocoder = new GClientGeocoder();
		var count = 0;
		
		/* Controls */
		map.addControl(new xSlider(52,17));
		map.addControl(new xNav());
		
		/* Base Icon Properties */
		var baseIcon = new GIcon();
		baseIcon.iconSize = new GSize(29, 40);
		baseIcon.iconAnchor = new GPoint(15, 40);
		baseIcon.infoWindowAnchor = new GPoint(15, 30);
		baseIcon.infoShadowAnchor = new GPoint(15, 30);
		baseIcon.image = "http://assets-static.lemansnet.com/sites/pythonperformance/img/maps/marker.png";
		
		function createIcon(point, id) {
			if(point) { 
				// Set Map Center
				count++;
				if(count == 1) { map.setCenter(point, 9);	}
				
				// Add Point to Dealers Object
				gmap_dealers[id].point = point;
				
			  // Set up our GMarkerOptions object
			  markerOptions = { icon:baseIcon, title:gmap_dealers[id].name };
			  var marker = new GMarker(point, markerOptions);	
				
				// Set Event Listener, Return Marker Object
				GEvent.addListener(marker, "click", function() {
					var dealer = gmap_dealers[id];
					var data = '<h3>' + dealer.name + '</h3>' + 
											'<p>' + dealer.address1 +  
											'<br />' + dealer.city + ',' + dealer.state + ' ' + dealer.zip + 
											'</p>';					
					map.panTo(marker.getPoint());
					xMap.markerWindow(marker, data, null);
				});
			  return marker;
			}
		}
				
		for(var i=0;i<gmap_dealers.length; i++) {
			//var address = gmap_dealers[i].address1 + ' ' + gmap_dealers[i].address2 + ' ' + gmap_dealers[i].city + ', ' + gmap_dealers[i].state + ' ' + gmap_dealers[i].zip;
			var latLng = new GLatLng(gmap_dealers[i].latitude, gmap_dealers[i].longitude);
			var id = i;
			var gcode = function(id, latLng) {
				//console.log(latLng);
				
				var marker = createIcon(latLng, id);
				if(marker) { markers[id] = (marker); map.addOverlay(marker); }
			}
			gcode(id, latLng);
		}
  }
}

/**
 * Fire off initial Python Event
 */

Event.onDOMReady(python.main);



