// BROWSER BEHAVIOUR SNIFFING We're going to inject a fake input element with a specified name
var form = document.createElement("div"),
id = "script" + (new Date).getTime();
form.innerHTML = "<a name='" + id + "'/>";
// Inject it into the root element, check its status, and remove it quickly
var root = document.documentElement;
var browser='brwDGEI';  //IE8, 9 Mox Fire Fox, Ope  ,Safa
root.insertBefore( form, root.firstChild );
if ( document.getElementById( id ) ) {	if(!window.postMessage) {browser='brwDA';} else {browser='NSupp'} }    //IE7 & IE6 (brwDA)  or Not supp
root.removeChild( form );
// END BEHAVIOUR SNIFF

var ALERT = new Array(7);

function CheckProcess(){
    ALERT[2]=""; 
	var MESSAGE="", SE;
if (browser='brwDA') {	
	CheckCard_Number(document.all.TICKETS);
	if ( document.all.Buyers_Email.value=="" || document.all.Buyers_Address.value=="" || document.all.Buyers_Name.value=="" || document.all.Buyers_Town.value=="" || document.all.Buyers_Phone.value=="" || document.all.Buyers_Postcode.value=="" || document.all.NameOnCard.value=="" || document.all.No_of_Tickets.value=='0') {ALERT[0]='- Not all fields have been filled out\n';ALERT[1]=""}
	else {
		SE = XCheckEmailValidity(document.all.Buyers_Email.value);ALERT[0]="";ALERT[1]="";
		if (SE != 'YES') {ALERT[1]='- Please check your email address, it appears to be incorrect\n'};
		};
	MESSAGE=ALERT[0]+ALERT[1]+ALERT[2];
	if (MESSAGE=="") {document.all.TICKETS.submit();}  
else {alert(MESSAGE);return;};	
};	

if (browser='brwDGEI') {
	if ( document.getElementById("Buyers_Email").value=="" || document.getElementById("Buyers_Address").value=="" || document.getElementById("Buyers_Name").value=="" || document.getElementById("Buyers_Town").value=="" || document.getElementById("Buyers_Phone").value=="" || document.getElementById("Buyers_Postcode").value=="" || document.getElementById("NameOnCard").value=="" || document.getElementById("Card_Number").value=="" || document.getElementById("Month").value=="" || document.getElementById("Year").value=="" ||  document.getElementById("No_of_Tickets").value=="0" ) {ALERT[0]='- Not all fields have been filled out\n';ALERT[1]=""}
	else {
		SE = XCheckEmailValidity(document.getElementById("Buyers_Email").value);ALERT[0]="";ALERT[1]="";
		if (SE != 'YES') {ALERT[1]='- Please check your email address, it appears to be incorrect\n'};
		};
	MESSAGE=ALERT[0]+ALERT[1]+ALERT[2];
if (MESSAGE=="") {document.getElementById("TICKETS").submit();} 
else {alert(MESSAGE);return;};	
};	
}

function SetCharge() {
var qty;
(browser='brwDA')?qty=document.all.No_of_Tickets.value:(browser='brwDGEI')?qty=document.getElementById("No_of_Tickets").value:0;
if (qty=="0") {
	if (browser='brwDA') {document.all.Ticket_Total.innerText='(to be determined)'};
	if (browser='brwDGEI') {document.getElementById("Ticket_Total").firstChild.data='(to be determined)'}
	return;
};
(browser='brwDA')? document.all.Charge.value=document.all.No_of_Tickets.value*120:(browser='brwDGEI')?document.getElementById("Charge").value=document.getElementById("No_of_Tickets").value*120:0;
if (browser='brwDA') {document.all.Ticket_Total.innerText='$'+document.all.Charge.value+'.00 inc GST'};
if (browser='brwDGEI') {document.getElementById("Ticket_Total").firstChild.data='$'+document.getElementById("Charge").value+'.00 inc GST'};
}

function FavADD(title,location) {
	if (window.sidebar) {window.sidebar.addPanel(title,location,'')}
	else if (window.external && !window.chrome) {window.external.AddFavorite(location,title)}
	else if (window.chrome){alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok')}
	else {alert('Limitations of your browser prevent the addition of bookmarks this way...\n\n')};	
}

function XCheckEmailValidity(EmailAddress) {
		var checkTLD=1;
		var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
		var emailPat=/^(.+)@(.+)$/;
		var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
		var validChars="\[^\\s" + specialChars + "\]";
		var quotedUser="(\"[^\"]*\")";
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
		var atom=validChars + '+';
		var word="(" + atom + "|" + quotedUser + ")";
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
		var matchArray=EmailAddress.match(emailPat);

		if (matchArray==null) {return 'no';}
		var user=matchArray[1];
		var domain=matchArray[2];

		for (i=0; i<user.length; i++) {	if (user.charCodeAt(i)>127) {return 'no';}}
		for (i=0; i<domain.length; i++) { if (domain.charCodeAt(i)>127) {return 'no';}}
		if (user.match(userPat)==null) {return 'no';}

		var IPArray=domain.match(ipDomainPat);
		if (IPArray!=null) {for (var i=1;i<=4;i++) { if (IPArray[i]>255) {return 'no';}}
		return 'YES';
		}
		var atomPat=new RegExp("^" + atom + "$");
		var domArr=domain.split(".");
		var len=domArr.length;
		for (i=0;i<len;i++) {if (domArr[i].search(atomPat)==-1) {return 'no';}}
		if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {return 'no';}
		if (len<2) {return 'no';}
		return 'YES';
}

// CC check
var Cards = new makeArray(3);
Cards[0] = new CARDS("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CARDS("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
var LuhnCheckSum = Cards[2] = new CARDS();

function CheckCard_Number(form) {
if (browser='brwDA') {
ALERT[2]=""
	if (form.Card_Number.value.length == 0) {ALERT[2]="- Please enter a Card Number.\n";form.Card_Number.focus();return;}
	tmpmonth = form.Month.options[form.Month.selectedIndex].value;
	if (!(new CARDS()).isExpiryDate(form.Year.value, tmpmonth)) {ALERT[2]="- This card has already expired.\n";return;}
	card = form.CARDS.options[form.CARDS.selectedIndex].value;
	var retval = eval(card + ".checkCard_Number(\"" + form.Card_Number.value +"\", " + form.Year.value + ", " + tmpmonth + ");");
	cardname = "";
	if (retval) {return}
	else {
		for (var n = 0; n < Cards.size; n++) {
			if (Cards[n].checkCard_Number(form.Card_Number.value, form.Year.value, tmpmonth)) {
			cardname = Cards[n].getCARDS();break;
		   }
		}
	if (cardname.length > 0) {ALERT[2]="- This looks like a " + cardname + " number, not a " + card + " number.\n"}
	else {ALERT[2]="- This card number is not valid.\n"}
	   }
};

}

function CARDS() {
	var n;
	var argv = CARDS.arguments;
	var argc = CARDS.arguments.length;
	this.objname = "object CARDS";
	var tmpCARDS = (argc > 0) ? argv[0] : "CardObject";
	var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
	var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";
	this.setCard_Number = setCard_Number;  // set Card_Number method.
	this.setCARDS = setCARDS;  // setCARDS method.
	this.setLen = setLen;  // setLen method.
	this.setRules = setRules;  // setRules method.
	this.setExpiryDate = setExpiryDate;  // setExpiryDate method.
	this.setCARDS(tmpCARDS);
	this.setLen(tmplen);
	this.setRules(tmprules);
	if (argc > 4) this.setExpiryDate(argv[3], argv[4]);
	this.checkCard_Number = checkCard_Number;  // checkCard_Number method.
	this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
	this.getCARDS = getCARDS;  // getCARDS method.
	this.isCard_Number = isCard_Number;  // isCard_Number method.
	this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
	this.luhnCheck = luhnCheck;// luhnCheck method.
	return this;
}

function checkCard_Number() {
	var argv = checkCard_Number.arguments;
	var argc = checkCard_Number.arguments.length;
	var Card_Number = (argc > 0) ? argv[0] : this.Card_Number;
	var year = (argc > 1) ? argv[1] : this.year;
	var month = (argc > 2) ? argv[2] : this.month;
	this.setCard_Number(Card_Number);
	this.setExpiryDate(year, month);
	if (!this.isCard_Number()) return false;
	if (!this.isExpiryDate()) return false;
	return true;
}

function getCARDS() {return this.CARDS}

function getExpiryDate() {return this.month + "/" + this.year}

function isCard_Number() {
	var argv = isCard_Number.arguments;
	var argc = isCard_Number.arguments.length;
	var Card_Number = (argc > 0) ? argv[0] : this.Card_Number;
	if (!this.luhnCheck()) return false;
	for (var n = 0; n < this.len.size; n++)
		if (Card_Number.toString().length == this.len[n]) {
			for (var m = 0; m < this.rules.size; m++) {
				var headdigit = Card_Number.substring(0, this.rules[m].toString().length);
				if (headdigit == this.rules[m])	return true;
				}
			return false;
		}
	return false;
}

function isExpiryDate() {
	var argv = isExpiryDate.arguments;
	var argc = isExpiryDate.arguments.length;
	year = argc > 0 ? argv[0] : this.year;	month = argc > 1 ? argv[1] : this.month;
	if (!isNum(year+"")) return false;
	if (!isNum(month+"")) return false;
	today = new Date();
	expiry = new Date(year, month);
	if (today.getTime() > expiry.getTime())
		return false;
	else
	return true;
}

function isNum(argvalue) {
	argvalue = argvalue.toString();
	if (argvalue.length == 0) return false;
	for (var n = 0; n < argvalue.length; n++)
		if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9") return false;
		return true;
}

function luhnCheck() {
	var argv = luhnCheck.arguments;
	var argc = luhnCheck.arguments.length;
	var Card_Number = argc > 0 ? argv[0] : this.Card_Number;
	if (! isNum(Card_Number)) {return false}
	var no_digit = Card_Number.length;
	var oddoeven = no_digit & 1;
	var sum = 0;
		for (var count = 0; count < no_digit; count++) {
			var digit = parseInt(Card_Number.charAt(count));
			if (!((count & 1) ^ oddoeven)) {
				digit *= 2;
				if (digit > 9)
				digit -= 9;
			}
			sum += digit;
		}
		if (sum % 10 == 0)
		return true;
		else
		return false;
}

function makeArray(size) {this.size = size; return this}

function setCard_Number(Card_Number) {this.Card_Number = Card_Number;return this}

function setCARDS(CARDS) {this.CARDS = CARDS;return this}

function setExpiryDate(year, month) {this.year = year; this.month = month;return this}

function setLen(len) {
	if (len.length == 0 || len == null) len = "13,14,15,16,19";
	var tmplen = len;
	n = 1;
	while (tmplen.indexOf(",") != -1) {
		tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
		n++;
	}
	this.len = new makeArray(n); n = 0;
	while (len.indexOf(",") != -1) {
		var tmpstr = len.substring(0, len.indexOf(","));
		this.len[n] = tmpstr;
		len = len.substring(len.indexOf(",") + 1, len.length);n++;
	}

this.len[n] = len;
return this;
}

function setRules(rules) {
	if (rules.length == 0 || rules == null)	rules = "0,1,2,3,4,5,6,7,8,9";
  	var tmprules = rules;
	n = 1;
	while (tmprules.indexOf(",") != -1) {
		tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
		n++;
	}
	this.rules = new makeArray(n); n = 0;
	while (rules.indexOf(",") != -1) {
		var tmpstr = rules.substring(0, rules.indexOf(","));
		this.rules[n] = tmpstr; rules = rules.substring(rules.indexOf(",") + 1, rules.length);
		n++;
	}
this.rules[n] = rules;
return this;
}
// EO CC check



