/**
 * @version	$Id: index.js 2934 2010-05-11 15:38:58Z awyld $
 * @author Andrew Wyld <awyld@easydns.com>
 * @category javascript
 * @copyright Copyright (c) 2007, EasyDNS Technologies Inc.
 */

var DOMAIN_VERIFIED = false;
var FORM_SUBMITTED = false;
var LOOKUP = null;
var REQUIRED_FIELDS = null;
var REQUIRED_FORM = null;
var IGNORE_DOMAIN = false;
var BULK_EDIT = false;
var BULK_VALID = new Array();
var BULK_INVALID = new Array();
var BULK_MSGS = new Array();
var domainObj;
var formObj;
var actionObj;
var bulkboxObj;
var hasError = false;

function specialAction(hide_domain_info) {
	try {
		if(hide_domain_info == null || hide_domain_info === false) {
			$('#domain_info').show();
			IGNORE_DOMAIN = false;
		} else {
			$('#domain_info').hide();
			IGNORE_DOMAIN = true;
		}
	} catch(e) {
		return fail(e);
	}
	toggleBulkEdit();
};


function detectTransferChange() {
	var sa = false;
	
	$('#regInstead').hide();
	hideError();
	$('#domain').removeClass('invalid');
	bulkboxObj.removeClass('invalid');

	try {
		
		// Default
		LOOKUP.must_exist = false;
		
		switch(actionObj.attr('value')) {
		case 'register':
			LOOKUP.is_transfer = false;
			break;
		case 'transfer':
			LOOKUP.is_transfer = true;
			break;
		case 'secondary':
			LOOKUP.is_transfer = false;
			LOOKUP.must_exist = true;
			break;
		case 'dns':
			LOOKUP.is_transfer = true;
			LOOKUP.must_exist = true;
			break;
		case 'bulk_transfer':
			LOOKUP.is_transfer = true;
			sa = true;
			break;
		case 'account':
			sa = true;
			LOOKUP.is_transfer = false;
			break;
		case 'certificate':
			LOOKUP.is_transfer = true;
			break;
		case 'reverse':
			sa = true;
			LOOKUP.is_transfer = false;
			break;
		case 'nothing':
			LOOKUP.is_transfer = false;
			actionObj.val('register');
			break;
		default:
			LOOKUP.is_transfer = false;
			break;
		};
		specialAction(sa);
	} catch(e) {
		return e;
	}

	return true;
};

/**
 * Hide/show the TLD select box based on the action selected.
 *
 * @return bool Success
 */
function toggleTLD() {
	if( actionObj.val() == 'dns' || actionObj.val() == 'secondary' || actionObj.val() == 'dynamic' || actionObj.val() == 'reverse') {
		$('#tld').hide().removeClass('required');
	} else {
		$('#tld').show();
		$('#tld').addClass('required');
	}
	
	if($('#action').val() == 'reverse') {
		/* $('#tld').removeClass('required'); */
		bulkboxObj.hide().removeClass('required');
		$('#domainPart').hide();
		$('#reverseForm').show();
		$('#domain').removeClass('required');
	} else {
		/* $('#bulkbox').hide().removeClass('required'); */
		$('#reverseForm').hide();
		$('#domainPart').show();
		$('#domain').addClass('required');
	}
	
	return true;
};


/**
 * BULK HANDLING
 */

function beforeBulkSubmit(ev) {
	hideError();
	$.blockUI();
	setTimeout($.unblockUI, 2000);

	// Remove stale error messages.
	$('.required').setValid();
	
	cleanError();
	
	// Perform validation
	$.requireFields(bulkboxObj);
	bulkboxObj.validate();
	
	if($.validated) {
		if(bulkValidate(bulkboxObj.val().toLowerCase())) {
			beginSubmit();
		} else {
			$.unblockUI();
			return false;
		}
	} else {
		$.unblockUI();
		return false;
	}
	
	$.unblockUI();
	return false;
};


function bulkValidate(raw) {
	var dups = new Array();
	
	if(bulkboxObj.hasClass('clearable')) {
		$.uerror.regError('bulkbox', 'Please provide a list of domains to continue.');
		// $.uerror.show();
		return false;
	}
	
	raw = raw.replace(/  /g, "\n");
	raw = raw.replace(/ /g, '');
	raw = raw.replace(/,/g, "\n");
	
	if(!sanitize(raw)) {
		addError("Illegal characters detected. Please verify your input and try again.");
		return false;
	}
	
	var domains = raw.split("\n");
	
	// Make sure we have a list
	if(domains == null || domains.length <= 0) {
		return false;
	}
	
	// Remove duplicate domains
	domains = RemoveDuplicates(domains);
	
	// Add domains in list to lookup queue.
	for(var i = 0; i < domains.length; i++) {
		var d = domains[i];
		
		// Get TLD
		var tld = domains[i].substr( ( domains[i].lastIndexOf('.') + 1 ) );
		
		if( !tld.match('com') && !tld.match('net') ) {
			$.uerror.regError('bulkbox', 'The domain ' + d + ' contains invalid TLD', domains[i]);
		} else {
			BULK_VALID.push(domains[i]);
			// DO BULK LOOKUP
			LOOKUP.add(domains[i], function (doc, d) {
				var result = AJAX.handleResponse(doc);
				if(LAST_AJAX_STATUS == 'ERROR') {
					hasError = true;
					$.uerror.regError('bulkbox', AJAX.brief, AJAX.host);
				}
				if(!LOOKUP.done()) {
					LOOKUP.next();
				} else {
					bulkboxObj.attr('disabled', false);
					if(hasError) {
						$.uerror.show();
						$.unblockUI();
					} else {
						$('#dmprchstart').submitOn();
						$('#dmprchstart').submit();
						return true;
					}
					/*
					var msg = '';
					for(var d in BULK_MSGS) {
						msg += d + '...' + BULK_MSGS[d] + "<br>\n";
					}
					*/
					// $.uerror.show();
					
					// $.unblockUI();
				}
			});	
		}
	}
	LOOKUP.start();
	return false;
	// return true;
};

/**
 * Hide/show the bulk edit box based on the action selected.
 *
 * @return bool Success
 */
function toggleBulkEdit() {
	$('#btnNext').unbind('click');
	if( actionObj.val() == 'bulk_transfer') {
		BULK_MODE = true;
		$('#btnNext').bind('click', beforeBulkSubmit);
		bulkboxObj.slideDown('slow');
	} else {
		BULK_MODE = false;
		$('#btnNext').bind('click', beforeSubmit);
		bulkboxObj.slideUp('slow');
	}
};

/**
 * beforeLogin
 * @return bool Success
 **/
function beforeLogin(ev) {
	if(ev == null || ev.which == null) {
		return;
	}
	
	if(ev.which == 13 && ($('#domain').length > 0)) {
		// beforeSubmit();
	}
	return;
};

/**
 * REVERSE DNS SUBMISSION
 */
function beforeReverseSubmit(ev) {
	var url = JDATA_URL + '/validate.php';
	var found = 0;
	var arpa = $('#arpa');
	var cidr = $('#cidr');
	var rfield = $('INPUT.reverse-field');
	var opts = {
		d: '',
		r: '',
		f: ''
	};
	
	hideError();
	$('#regInstead').hide();
	rfield.setValid();
	
	/* User isn't allowed to enter both */
	if(cidr.val().length > 0 && arpa.val().length > 0) {
		rfield.setInvalid();
		missingReqField('arpa');
		missingReqField('cidr');
		$.unblockUI();
		return false;
	}
	
	/* There can be only one! Let us default to CIDR like andorra */
	if(cidr.val().length > 0) {
		found++;
		opts.d = cidr.val();
		opts.r = 'valid-cidr';
		opts.f = cidr.attr('name');
		if(!isValidCIDR(opts.d)) {
			cidr.setInvalid();
			// missingReqField('cidr');
			$.unblockUI();
			return false;
		}
	}
	
	
	if(arpa.val().length > 0) {
		if(numSegs(arpa.val()) == 3) {
			arpa.val('0.' + arpa.val());
		}
		if(!isValidIP(arpa.val())) {
			arpa.setInvalid();
			missingReqField('arpa');
			$.unblockUI();
			return false;
		}
		found++;
		opts.d = arpa.val();
		opts.r = 'valid-ip';
		opts.f = arpa.attr('name');

	}


	
	/* Both fields provided! */
	switch(found) {
		case 0:
			rfield.setInvalid();
			missingReqField('cidr');
			// missingReqField('arpa');
			$.unblockUI();
			break;
		case 1:
			/* Validate ARPA or CIDR */
			$.getJSON(url, opts, function (data) {
				if(data == null || data.length <= 0) {
					$.unblockUI();
					return false;
				}
				if(data.is_valid) {
					/* Time for the next page */
					beginSubmit();
				}
				$.unblockUI();
			});
			break;
		case 2:
			rfield.setInvalid();
			missingReqField('arpa');
			$.unblockUI();
			break;
		default:
			rfield.setInvalid();
			missingReqField('arpa');
			$.unblockUI();
			break;
	};
	return false;
};


function onEnter(ev) {
	if(ev.which == 13) {
		beforeSubmit();
	}
}

/**
 * beforeSubmit
 */
function beforeSubmit(e) {
	var action = actionObj.val();
	
	$.PAGE.busy();
	hideError();
	$('#regInstead').hide();
	
	
	if( action == 'bulk_transfer') {
		if(bulkValidate(bulkboxObj.val().toLowerCase())) {
				beginSubmit();
		}
	} else if(action == 'reverse') {
		beforeReverseSubmit(e);
		return;
	} else if(IGNORE_DOMAIN) {
		beginSubmit();
		return;
	}
	/* Domain names must be 2+ characters (some require 3) */
	if(domainObj.val().length < 2) {
		addError("Please provide a valid domain name with 3+ letters.", {field: 'domain'});
		$.PAGE.unbusy();
		return false;
	}
	domainObj.validate();
	if($.validated) {
		FORM_SUBMITTED = true;
		/* begin submit gets called by verifyDomain */
		verifyDomain();
	} else {
		$.PAGE.unbusy();
		return false;
	}
	return true;
};

/**
 * beginSubmit
 * 
 * @return bool Success
 */
function beginSubmit() {
	var url = JDATA_URL + 'findtld.php';
	
	$.cookie('signup_action', $('#action').val(), {path: '/'});
	if(actionObj.val() != 'bulk_transfer' && actionObj.val() != "reverse") {
		$.getJSON(url, {d: $('#domain').val(), t: $('#tld').val()}, function (json) {
			$.cookie('signup_domain', json.domain, {path: '/'});
			$.cookie('signup_tld', json.tld, {path: '/'});
			$('#dmprchstart').submitOn();
			$('#dmprchstart').submit();
			$.PAGE.unbusy();
		});
	} else {
		$('#dmprchstart').submitOn();
		$('#dmprchstart').submit();
	}
	return true;
};

/**
 * STARTUP
 */
jQuery(document).ready(function () {
	jQuery.formid = '#dmprchstart';
	LOOKUP = new Lookup();
	domainObj = $('#domain');
	formObj = $('#dmprchstart');
	bulkboxObj = $('#bulkbox');
	actionObj = $('#action');
	
	// $('#btnNext').bind('click', beforeSubmit);
	formObj.bind('submit', beforeSubmit);
	
	/* Registration type */
	actionObj.change(detectTransferChange);
	
	/* Monitor changes to domain field */
	domainObj.change(function () {
		DOMAIN_VERIFIED = false;
		hideError();
		$('#regInstead').hide();
		$(this).data('verified', false);
	});
	
	/* Monitor changes to reverse dns inputs */
	$('INPUT.reverse-field').keyup(function (ev) {
		$(this).data('verified', false);
		$(this).setValid();
	});
	
	/* Look for server errors */
	formObj.indicateValidity();
	
	/* Add register instead link */
	$('#regInsteadLink').click(regInsteadLink);
	
	/* Watch changes to tld */
	$('#tld').change(function () {
		hideError();
		$('#regInstead').hide();			
	});

	/* Disable submission */
	formObj.submitOff();
	
	/* Detect page settings on reload */
	detectTransferChange();
	domainObj.keyup(beforeLogin);
	toggleTLD();
	toggleBulkEdit();
	
	return true;
});

