jQuery(function () {
    jQuery('input#jadukaCalling')
		.keyup(jadukaFormatPhone)
		.keydown(jadukaStoreSubKey)
		.focus(jadukaShowPrompt)
		.blur(jadukaHidePrompt)
		.each(jadukaSetupPhone);
		
	jQuery('form#jadukaCnc')
		.submit(jadukaStartCall);
		
	jQuery('div#jadukaDebug').hide();
});

function jadukaStartCall(event) {
	event.preventDefault();
	
	var $$            = jQuery(this);
	var submit        = jQuery('input#jadukaSubmit');
	var debug         = jQuery('div#jadukaDebug');
	var input         = jQuery('input#jadukaCalling');
	var callingNumber = input.val().replace(/[^\d]/g, '');
	
	if (callingNumber.length < 10) {
		debug.text('Please enter a 10 digit number.');
		debug.slideDown(500, function() {
			debug.animate({d:1}, 5000).slideUp(500);
		});	
	} else {	
		$$.fadeTo(500, 0.5);
		$$.children('input').attr('disabled', 'disabled');
		submit.val('HOLD');	
		
		jQuery.ajax({
			url: '/jaduka/cnc.php',
			type : 'GET',
			dataType: 'json',
			data: {callingNumber: callingNumber},
			success: function (data, textStatus) {				
				// List a debug message for success or error
				if (data.success) {
					// Reset to the default
					input.val(input.attr('defValue'));			
					input.css('color', '');
				
					debug.text('Call started, please hold.');
				} else {
					debug.text('Unable to initiate call.');
				}
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) {
				debug.text('Unable to initiate call.');
			},
			complete: function (XMLHttpRequest, textStatus) {
				$$.fadeTo(500, 1.0);
				$$.children('input').attr('disabled', '');	
				submit.val('CALL');	
				debug.slideDown(500, function() {
					debug.animate({d:1}, 5000).slideUp(500);
				});
			}
		});
	}
}

function jadukaSetupPhone() {
	var $$ = jQuery(this);
	$$.attr('defValue', $$.val());	
}

function jadukaShowPrompt(event) {
	var $$ = jQuery(this);	
	if ($$.val() == $$.attr('defValue')) {
		$$.val('');
		$$.css('color', '#515151');
	}
}

function jadukaHidePrompt(event) {
	var $$ = jQuery(this);
	if ($$.val() == '') {
		$$.val($$.attr('defValue'));
		$$.css('color', '');
	}
}

function jadukaStoreSubKey(event) {
    var field = jQuery(this);
    var key   = event.keyCode;


    // This is a patch to allow select all for copying
    if (field.attr('subKey') == 17 && key == 65) {
        field.attr('selectAll', 1);
    } else {
        field.attr('subKey', key);
        field.attr('selectAll', 0);
    }
}

function jadukaFormatPhone(event) {
    var field  = jQuery(this);
    var key    = event.keyCode;
    var caret  = jQuery(this).caret().start;
    var number = field.val();

    if (field.attr('selectAll') == 1) {
        return;
    }
    
    // If within a valid display key, backspace, or delete
    if (key == -1 || key == 8 || key == 46 || key == 32 || (key >= 48 && key <= 111)) {
        // Strip out any non digit characters
        // We will pump our fancy chars back in but its easier to strip first
        var beforeCaret = number.substr(0, caret).replace(/[^\d]/g, '');
        var afterCaret  = number.substr(caret).replace(/[^\d]/g, '');
        number          = beforeCaret + afterCaret;

        // Update the caret if anything was stripped
        caret = beforeCaret.length;

        // If the user hits backspace on a fancy character, we need to remove a number
        if (key == 8 && field.attr('lastNumber') == number) {
            number = number.substr(0, caret - 1) + number.substr(caret);
            caret--;
        }

        // If the user hits delete on a fancy character, remove future number
        if (key == 46 && field.attr('lastNumber') == number) {
            number = number.substr(0, caret) + number.substr(caret + 1);
        }

        // Store the current number for checks with backspace and delete
        field.attr('lastNumber', number);

        // Don't allow them to start with a +1
        if (number.charAt(0) == '1') {
            number = number.substr(1);
            caret--;
        }

        // Over ten characters assume it is an extension
        if (number.length >= 11) {
            number = number.substr(0, 10) + ' #' + number.substr(10);
            if (caret >= 10) {
                caret += 2;
            }
        }

        // Once past the npa and nxx add a - then station
        if (number.length >= 6) {
            number = number.substr(0, 6) + '-' + number.substr(6);
            if (caret >= 6) {
                caret++;
            }
        }

        // Once a user starts, wrap in parenthesis and add a space
        if (number.length >= 1) {
            number = '(' + number.substr(0, 3) + ') ' + number.substr(3);
            if (caret >= 3) {
                caret += 3;
            } else {
                caret++;
            }
        }

        // Make sure the caret exists within the scope or it will be select all
        caret = Math.min(number.length, caret);

        // Update number
        field.val(number);
        field.caret(caret);
    }
};