var email_regex = /^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/
var date_regex = /^(?:[01]?[0-9]|2[0-9](?!\/0?2)|2(?:[0-8]|9(?=\/(?:0?2\/\d{2}0[48]|[2468][048]|[13579][26])))|(?:3(?:0|1(?=\/(?:0?[13578]|1[02]))))(?!\/0?2))\/(?:0?[1-9]|1[0-2])\/(?:\d{4})$/
var time_regex = /^(([0-9])|([0-1][0-9])|([2][0-3])):(([0-9])|([0-5][0-9]))$/
var colour_regex = /^(\#[0-9a-fA-F]{6})$/

function returnNumbers(field) {
	var regex = /^[0-9+\.]*$/;
    if (!regex.test(field.value)) {
       field.value = field.value.replace(/[^0-9+\.]/g,"");
	}
}

function assertNotEmpty(element, message) {
    if (!message) {
        message = element.name + ' is required';
    }
    if (element.value == '') {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertIsFloat(element, message) {
    if (!message) {
        message = 'Invalid format of ' + element.name + ' value';
    }
    if (!element.value || parseFloat(element.value) != element.value) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertFloatRange(element, min, max, message) {
    if (!assertIsFloat(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be a number from ' + min + ' to ' + max;
    }
    if (element.value < min || element.value > max) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertFloatRangeExclusive(element, min, max, message) {
    if (!assertIsFloat(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be a number from ' + min + ' to ' + max;
    }
    if (element.value <= min || element.value >= max) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertIsInt(element, message) {
    if (!message) {
        message = ' Invalid format of ' + element.name + ' value';
    }
    if (!element.value || parseInt(element.value) != element.value) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertIntGT(element, value, message) {
    if (!assertIsInt(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be greater then ' + value;
    }
    if (element.value > value) {
        return true;
    }
    alert(message);
    enableButtons();
    element.focus();
    return false;
}

function assertIntRange(element, min, max, message) {
    if (!assertIsInt(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be a number from ' + min + ' to ' + max;
    }
    if (element.value < min || element.value > max) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function assertIsMoney(element, message) {
    return assertFloatGE(element, 0, message);
}

function assertFloatGT(element, value, message) {
    if (!assertIsFloat(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be greater then ' + value;
    }
    if (element.value > value) {
        return true;
    }
    alert(message);
    enableButtons();
    element.focus();
    return false;
}

function assertFloatGE(element, value, message) {
    if (!assertIsFloat(element, message)) {
        return false;
    }
    if (!message) {
        message = element.name + ' must be greater or equal then ' + value;
    }
    if (element.value >= value) {
        return true;
    }
    alert(message);
    enableButtons();
    element.focus();
    return false;
}

function assertIsValidEmail(element, message) {
    if (!message) {
        message = 'Invalid email address in ' + element.name;
    }
    if (email_regex.test(element.value) == true) {
        return true;
    }
    alert(message);
    enableButtons();
    element.focus();
    return false;
}

function assertIsHexColourValid(element, message) {
	if (!message) {
		message = 'Invalid colour format in ' + element.name;
	}
	if (colour_regex.test('#' + element.value) == true || element.value == '' ) {
        return true;
    }
    alert(message);
    enableButtons();
  	element.focus();
    return false;

}

function assertIsDomain(element, message) {
    if (!message) {
        message = 'Invalid web address in ' + element.name;
    }
	if (element.value.indexOf("http:\/\/") != -1) {
	    message = element.name + ' should not have "http://"';
        alert(message);
        enableButtons();
        element.focus();
 	    return false;
	}
	if (element.value.indexOf("www") != -1) {
	    message = element.name + ' should not have "www"';
        alert(message);
        enableButtons();
        element.focus();
 	    return false;
	}
	return true;
}

function assertIsTextOnly(element, message) {
	var regex = /^[a-zA-Z0-9+]*$/;

    if (!message) {
        message = 'Invalid ' + element.name;
    }
    if (!regex.test(element.value)) {
        alert(message);
        enableButtons();
        element.focus();
        return false;
    }
    return true;
}

function checkDate(element) {
	if (!date_regex.test(element.value)) {
		alert('Please enter correct date');
		enableButtons();
		element.focus();
		return false;
	}
	return true;
}

function datesCompare(startDate, endDate) {
	var comparsion = 0;
	var startYear = parseInt(startDate.substr(6, 4),10);
	var endYear   = parseInt(endDate.substr(6, 4),10);
	var startMonth =  parseInt(startDate.substr(3, 2),10);
	var endMonth =  parseInt(endDate.substr(3, 2),10);
	var startDay = parseInt(startDate.substr(0, 2),10);
	var endDay = parseInt(endDate.substr(0, 2),10);

	if ((startYear == endYear) && (startMonth == endMonth) && (startDay == endDay)) {
		return 0;
	}
	if (startYear > endYear) {
		return 1;
	}
	if(startMonth > endMonth && startYear == endYear) {
		return 1;
	}
	if (startDay > endDay && startYear == endYear && startMonth == endMonth) {
		return 1;
	}
	return -1;
}