/*
	Site: 		Domain Pigeon.com
	Author: 	Matt Mazur 
*/

function init() {

	countDown();

	var domainLinks = document.getElementsByClassName('killDomain');

	 // now loop over them attach events to them
	 for (i = 0; i < domainLinks.length; i++) {
		Event.observe(domainLinks[i].id, 'click', remClicked);
	}
	
	var modLinks = document.getElementsByClassName('modDomain');

	 // now loop over them attach events to them
	for (i = 0; i < modLinks.length; i++) {
		Event.observe(modLinks[i].id, 'click', modClicked);
	}
	
	// watch the favorite link
	if ($('favLink') != null)
		Event.observe('favLink', 'click', favClick);

	// close msg
	if ($('closeMsg') != null)
		Event.observe('closeMsg', 'click', closeClicked);

	// ajax whois
	if ($('whoisBox') != null)
		Event.observe('whoisBox', 'keyup', whoisDown);

	// ajax display box
	if ($('domainRefresh') != null)
		Event.observe('domainRefresh', 'click', refreshClicked);

	// whois
	if ($('whoisButton') != null)
		Event.observe('whoisButton', 'click', whoisClicked);
		
	// reg confirm
	if ($('reg_confirm') != null)
		Event.observe('reg_confirm', 'click', regConfirmClicked);
	
	// Create an account
	if ($('reg_button') != null)
		Event.observe('reg_button', 'click', createAccountClicked);
		
	// paypal express image
	if ($('paypal_express_image') != null)
		Event.observe('paypal_express_image', 'click', paypal_express_clicked);
	

	domainHook();
	
	var randomNumber=Math.floor(Math.random()*8) + 1;
	$('pressRocks').innerHTML = $('press' + randomNumber).innerHTML;
	
	pressRoll();
}

// Paypal Express

function paypal_express_clicked(event) {
	window.location = 'https://www.domainpigeon.com/users/express?email=' + $('user_email').value;
	event.stop();
}

/* Admin ----------------------------------------------------------------------- */

function modClicked(event) {
	var element = Event.element(event);
	var domainOp = element.id.substring(0, "1234".length);
	var domainID = element.id.substring('1234'.length);

	if (domainOp == 'scop') {
		new Ajax.Updater(element.id, '/domains/mod?op=scop&id=' + domainID, {
			method: 'get',
		    onComplete: function() {
	
			}
		});
	}
	event.stop();
}

function remClicked(event) {
	var element = Event.element(event);
	var domainID = element.id.substring('kill'.length);
	
	var answer = true //confirm('Do you really want to remove this domain name?');
	
	if (answer) {
		
		new Ajax.Request('/domains/kill?id=' + domainID, {
			method: 'get',
		    onComplete: function() {

				var domainDisplay = $('display' + domainID);
				domainDisplay.style.color = '#ff0000';
				domainDisplay.style.textDecoration = 'line-through';
				element.hide();
			}
		});
	}


	event.stop();
}

/* Support ----------------------------------------------------------------------- */

function refreshClicked(event) {
	var element = Event.element(event);
	var quickInfo = $('domainQuickInfo');

	element.hide();
	
	var displayBox = $('domainStatus');

	new Ajax.Updater('refreshWindow', '/whois/' + element.className, {
	  	method:     'get',
	  	onCreate:   function() {	
			displayBox.innerHTML = '<img src="../images/spinner.gif">'
			},
	    onFailure:  function() {},
	    onComplete: function() {
		
			bRegd = ($('refreshWindow').innerHTML).indexOf('Available') == -1;
			
			displayBox.innerHTML = bRegd ? 'This domain has been registered' : 'This domain is available!';
			quickInfo.style.background = bRegd ? '#ffdddd' : '#ddffdd';
		
		}
	});
	
	event.stop();
}

function whoisClicked(event) {
	processWhois();
}

function whoisDown(event) {
	if (event.keyCode == 13) {
		processWhois();
	}
}

function processWhois(event) {

	var whoisBox = $('whoisBox');
	var whoisStatus = $('whoisStatus');
	
	var re = /^([a-zA-Z0-9]{2,})(-([a-zA-Z0-9]+))*$/;

	var domainName = whoisBox.value;
	
	// No, you're not supposed to put ".com" at the end, but just in case...
	if (domainName.length > 4 && domainName.substr(domainName.length - 4, domainName.length).toLowerCase() == '.com') {
		domainName = domainName.substr(0, domainName.length - 4);
	}

	whoisStatus.className = '';

	if (re.test(domainName) == false) {
		whoisStatus.innerHTML = 'Awaiting input...<br><br>Keep it simple!';
	} else {
		new Ajax.Updater('whoisStatus', '/whois/' + domainName, {
		  	method:     'get',
		  	onCreate:   function() {
				whoisStatus.className = '';
				whoisStatus.innerHTML = '<br>Checking<br><b>' + domainName + '.com</b><br><br><img src="../images/spinner-small.gif">'
				},
		    onFailure:  function() {},
		    onComplete: function() {

			 if ((whoisStatus.innerHTML).indexOf(domainName) == -1) {
			 	whoisStatus.innerHTML = 'Catching up...<br><br><img src="../images/spinner-small.gif">';
			 	return;
			 }

			var newClass = (whoisStatus.innerHTML).indexOf('Available') > -1 ? 'whoisAvailable' : 'whoisRegistered';

			whoisStatus.className = newClass;

			}
		});
	}
	
	event.stop();
}

/* Support ----------------------------------------------------------------------- */

function isSignupLink(linkHref) {
	return (linkHref.indexOf('session') > -1);
}

/* Notice Box ----------------------------------------------------------------------- */

function closeClicked(event) {
	$('notice').hide();
	event.stop();
}

function regConfirmClicked(event) {
	var element = Event.element(event);
	$('reg_button').disabled = ! element.checked;
}

// Ensure the registration information is accurate prior to processing
function createAccountClicked(event) {

	var email = $('user_email').value;
	var emailRE = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i;
	
	if (email.match(emailRE) == null) {
		alert ('Please double check your email address.');
		event.stop();
		return false;
	}
	
	var password1 = $('user_password').value;
	var password2 = $('user_password_confirmation').value;
	var passwordRE = /^([a-zA-Z0-9!@#%]{6,30})$/;
	
	if (password1 != password2) {
		alert ('Your passwords do not match.');
		event.stop();
		return false;
	}
	
	if (password1.match(passwordRE) == null) {
		alert ('Your password must be at least 6 characters long and must contain only letters, numbers, or @, #.');
		event.stop();
		return false;
	}

	var order_first_name = $('order_first_name').value;
	var order_last_name = $('order_last_name').value;
	var order_card_number = $('order_card_number').value;
	var order_card_verification = $('order_card_verification').value;

	if ((order_first_name == '') || (order_last_name == '') || (order_card_number) == '' || (order_card_verification == '')) {
		alert ('Please ensure all payment fields are properly filled out.');
		event.stop();
		return false;
	}
	
}

/* Domain Item ----------------------------------------------------------------------- */

function domainHook() {
	var elts = document.getElementsByClassName('domainItem');

	 // now loop over them attach events to them
	 for (i = 0; i < elts.length; i++) {
		Event.stopObserving(elts[i].id);
		Event.observe(elts[i].id, 'click', domainClicked);
		Event.observe(elts[i].id, 'mouseover', domainArrive);
		Event.observe(elts[i].id, 'mouseout', domainDepart);
	}
}

function domainArrive(event) {
	var element = Event.element(event);
	var domainID = element.id.substring("domain".length);
	var domainHolder = $('holder' + domainID);

	var favLink = $('favLink');
	
	if (favLink) {
			
		favLink.removeClassName('marker_no');
		favLink.addClassName('marker_yes');
		element.insert({after: favLink});
	
		var favURL = $('favURL' + domainID);
		var baseURL = (favURL.innerHTML).replace(/^\s+|\s+$/g, '');

		if (isSignupLink(baseURL) == true) {
			favLink.href = favURL.innerHTML;
			favLink.title = 'Sign up to use Favorites';
		} else {
	
			if (element.hasClassName('fav_yes') == true) {
				favLink.innerHTML = '-';
				favLink.title = 'Remove from Favorites';
				favLink.href = baseURL + '&op=remove';
			} else {
				favLink.innerHTML = '+';
				favLink.title = 'Add to Favorites';
				favLink.href = baseURL + '&op=add';
			};
		}
	}
}

function dropDown(domainID) {

	// Immediately blind up the about section and then blind down
	var about = $('aboutContent');
	var curElement = $('domain' + domainID);
	
	// Hide previous
	if (about.getStyle('display') == 'block') 
		about.hide();
	
	// Insert at correct location
	$('domain' + domainID).insert({after: about});
	
	new Ajax.Updater("aboutResult", '/domains/dropdown/' + domainID, {
		method: 'get',
		onLoading: function() {
			Effect.BlindDown('aboutContent', {duration: 1});
			$('aboutResult').innerHTML = '<p align="center"><img src="../images/spinner.gif"></p>';
		},
	    onComplete: function() {
			$('domain' + domainID).setStyle({background: $('newColor').innerHTML});
		}
	});
}

function domainDepart(event) {
	var element = Event.element(event);
	var domainID = element.id.substring("domain".length);

	var favLink = $('favLink');
	
	if (favLink) {
		var markerPos = favLink.cumulativeOffset();
		var markerDim = favLink.getDimensions();
	
		// check whether it is in the marker
		var bOverTarget = ((Event.pointerX(event) >= markerPos.left) && 
											(Event.pointerX(event) <= (markerPos.left + markerDim.width)) &&
											(Event.pointerY(event) >= markerPos.top) &&
											(Event.pointerY(event) <= (markerPos.top + markerDim.height)));

		if (bOverTarget == false) {
			favLink.removeClassName('marker_yes');
			favLink.addClassName('marker_no');
		}
	}
}

function domainClicked(event) {
	var domainID = (Event.element(event)).id.substring("domain".length);
	dropDown(domainID);	
	event.stop();
}

/* Favorite Link ----------------------------------------------------------------------- */

function favClick(event) {

	var element = Event.element(event);
	var domainLink = element.previous();

	if (isSignupLink(element.href) == false) {

		new Ajax.Request(element.href, {
			method: 'get',
			onCreate: function() {
				if (element.innerHTML == '+') {
					element.innerHTML = '-';
					domainLink.addClassName('fav_yes');
				} else {
					element.innerHTML = '+';
					domainLink.removeClassName('fav_yes');
				}
			}
		});
		event.stop();
	}
}

/* Updater ----------------------------------------------------------------------- */

var nextTime = 'reset';

function getNextReleaseTime() {

	new Ajax.Request('/domains/updater?op=releasetime', {
		method: 'get',
		onLoading: function() {
			$('diffTime').innerHTML = '<img src="../images/loaderLite.gif">';	
		},
	    onComplete: function(transport) {					
			nextTime = parseInt(transport.responseText);	
		}
	});	
}

function countDown() {

	if ($('diffTime') == null)
		return;

	 setTimeout(function() {
		
		var diffTime = $('diffTime');
		
		if ((nextTime == 0) || (nextTime == NaN)) {
			diffTime.innerHTML = '<img src="/images/pigeon_mini.png">'
			return;
		} else if (nextTime == 'reset') {
			getNextReleaseTime();
		} else {
	
			var curTime = Date.parse((new Date).toUTCString()) / 1000;
			var secTillRelease = parseInt(nextTime) - parseInt(curTime);
			
			if (secTillRelease == NaN) {
				diffTime.innerHTML = '<img src="/images/pigeon_mini.png">';
			} else {
			
				diffTime.innerHTML = formatSec(secTillRelease);
			
				if (parseInt(secTillRelease) <= 0) {
					// tell the user to update
				
					diffTime.innerHTML = "Time to refresh!"
				
					return; 

				}
			}
		}
		
		countDown();
	}, 1000);
	
}

function pressRoll() {
	
	setTimeout(function() {
		
		var divRoll = $('pressRocks');
		var curPressNum = parseInt((divRoll.className).substr("item".length));
		var nextPressNum = curPressNum + 1;
	
		if ($('press' + nextPressNum) == null) {
			nextPressNum = 1;
		}
		
		var nextQuote = $('press' + nextPressNum);
	
		Effect.Fade('pressRocks', { duration: 2, 
			afterFinish: function () {
		   		divRoll.innerHTML = nextQuote.innerHTML;
				Effect.Appear('pressRocks', {duration: 2});
				divRoll.className = 'item' + nextPressNum;
			}
		});
		
		pressRoll();
		
	}, 30000);
}

function formatSec(numSeconds) {
	
	numSeconds = parseInt(numSeconds);
	
	if (numSeconds <= 0) {
		return '0:00';
	}
	
	hours = Math.floor(numSeconds / 3600);	
	secsLeftOver = numSeconds % 3600;
	mins = Math.floor(secsLeftOver / 60);
	sec = secsLeftOver % 60;
	mins_to_s = mins.toString().length == 1 ? '0' + mins : mins;
	sec_to_s = sec.toString().length == 1 ? '0' + sec : sec;
	if (hours > 0) {
		return hours + ':' + mins_to_s + ':' + sec_to_s
	} else {
		return mins + ':' + sec_to_s;
	}
}

Event.observe(window, 'load', init);
