/*-----------------------------------------------------------------------------------

 * © Ganz - This code is exclusively the property of Ganz and all 
 * rights therein, including without limitation copyrights and trade
 * secrets, are reserved by Ganz.  Any reproduction, disclosure,
 * distribution or unauthorized use is strictly prohibited.
 
 JavaScript Document used for all the forms and countries
 csFormValidation.js
 
 1.0.0 @autor Ehsanul Haque		
 2.0.0 @autor Konstantin Glazov	
 3.0.0 @autor Natalia Roque		

 -----------------------------------------------------------------------------------*/


var email_req;
var unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.~";
var hexchars   = "0123456789ABCDEFabcdef";


/* print email response message  */
function sendEmailResponse(formName, xmlHttp) {

	if (xmlHttp.readyState == 4 || xmlHttp.readyState=="complete") {
	    
	    var responseMessage = document.getElementById(formName + '_error');
	    
		if (xmlHttp.status == 200) {

			// for degugging
			// responseMessage.innerHTML = xmlHttp.responseText;
			var response = xmlHttp.responseText;  // rerunt 1 or 0
			
			if (response) {
				responseMessage.innerHTML = document.getElementById("lemail_send").value.toUpperCase();
				eval("document."+refId+".reset()");
			} else {
				responseMessage.innerHTML = document.getElementById("lemail_notsend").value.toUpperCase(); 
				document.getElementById(refId+'_reqbutton').disabled = false;
			}
		}
 	}
}


/* Send Email to the client */
function sendemail(formName, messageValues) {
	
	var xmlHttp;
	xmlHttp=GetXmlHttpObject();
	
	if (xmlHttp==null) {
        alert ("Browser does not support HTTP Request");
	    return;
 	} 
 	
	// contruct url
    var url = '../sendmail.php?' + messageValues;
	 
	// Send HTTP Request
	xmlHttp.onreadystatechange=function() { sendEmailResponse(formName, xmlHttp); };
	xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
}



/**********************************************************
 * Process Form
***********************************************************/
function process(formName, title) {

	// DEFINE VARIABLES
    var xmlHttp = document.getElementById(formName+'_error');
    var birth_date = "l"+formName+"_birth_date";
	var count = 0, birth_count=0;
    var StateProvinceValue = "";
    
    var values = new Array();
    var labels = new Array();
    var birthDayField = new Array();
    var isValidForm = new Array(), valid_count=0;
    
    // POPULATE FORM FIELD VALUES AND LABELS
    var number = document.forms[formName].elements.length;
    for (var i = 0; i < number; i++) {
        var element = document.forms[formName].elements[i].name;
        
        if (document.getElementById('l'+element) != null) {
            labels[count] = 'l'+element;
            values[count] = element;
            count++;
            
        } // set bith day field
        else if (element == formName+"_bDay" || element == formName+"_bMonth" || element == formName+"_bYear") {
            birthDayField[birth_count++] = element;
        }
    }

    
	// RESET COLOR
	xmlHttp.innerHTML = "";
	for (var i = 0; i < labels.length; i++) {
		document.getElementById(labels[i]).style.color = '#000066';
    }
    
    
    // VALIDATE USER ENTRIES
    
    // Check for empty fields
	for (var i = 0; i < values.length; i++) {
	    if(document.getElementById(values[i]).value == '' ) {	
		   document.getElementById(labels[i]).style.color = '#ff0000';
		   isValidForm[0] = false;
		   valid_count = 1;
		}
    }
    
    // Check birh day
	if (birthDayField.length) {
        document.getElementById(birth_date).style.color = '#000066';             // reset color
        isValidForm[valid_count++] = isValidBirthday(birthDayField, birth_date); // validate birth date selection
        var birthDay = makeEnglishDate(birthDayField);                           // convert birth date to English date format YYYY-MM-DD
	}
	
    // print empty field error message
    for (var i = 0; i < isValidForm.length; i++) {
    	if (isValidForm[i] == false) {
			xmlHttp.innerHTML = document.getElementById("lrequired_fields").value.toUpperCase();
			return;
		}
    }
    
    // validate length and character intput if it is not valid print error message and exit
	for (var i = 0; i < values.length; i++) {
		
		// validate feature code
		if (values[i] == (formName + "_fc")) {
			if (document.getElementById(values[i]).value.length != 16 ) { 
				printErrorMessage(xmlHttp, labels[i], document.getElementById(labels[i]).innerHTML, 16);
				return;
			}	
		} 
		// validate secret code 
		else if (values[i] == (formName + "_sc")) {
		    if (document.getElementById(values[i]).value.length != 8 ) { 
				printErrorMessage(xmlHttp, labels[i], document.getElementById(labels[i]).innerHTML, 8);
				return;
			}
		} 
		// validate Email 
		else if (values[i] == (formName + "_email")) {
		    if (isValidEmailAddress(xmlHttp, values[i], labels[i], values, labels) == false) return;
		} 
		// validate country-state-province selection 
		else if (values[i] == (formName + "_country")) {
			StateProvinceValue = isValidCountryStateProvince(xmlHttp, values[i], labels[i], formName);
			if (StateProvinceValue == false) return;
		}
		// validate text area length
        else if (values[i] == (formName + "_desc")) {
        	if (isValidDescription(xmlHttp, values[i], labels[i]) == false) return;
		}
		// validate pet name/desired pet name
		else if (values[i] == (formName + "_pet_name") || values[i] == (formName + "_desired_petname")) {
			if (isValidPet(xmlHttp, values[i], labels[i]) == false) return;
		}
		// validate room name
		else if (values[i] == (formName + "_room_name")) {
			if (isValidRoomName(xmlHttp, values[i], labels[i]) == false) return;
		}
		// validate item name
		else if (values[i] == (formName + "_item")) {
			if (isValidItem(xmlHttp, values[i], labels[i]) == false) return;
		}
		// validate user name/desired user name/friends user name
		else if (values[i] == (formName + "_username") || values[i] == (formName + "_desired_username") || values[i] == (formName + "_friend_username")) {
			if (isValidUserName(xmlHttp, values[i], labels[i]) == false) return;
		}
		
	}
	
	
	// CONSTRACT URL
	var url = '../ticket.php';
	url += '?function_call=checkGeneric&flag='+formName.replace(/i/, "");
	for (var i = 0; i < values.length; i++) {
        // extract field name
		var field_name = values[i];
		var substr = field_name.replace(formName, "");
		field_name = substr.replace(/_/, "");
		url += '&'+ field_name + "=" + urlEncode( document.getElementById(values[i]).value );
    }
    url += (birthDayField.length      ? "&birth_date=" + urlEncode(birthDay) : '');                // add birth date
    url += (StateProvinceValue.length ? "&state_province=" + urlEncode(StateProvinceValue) : '');  // add state-province
    url += '&title=' + urlEncode( title );
     
    url += "&localization=" +document.getElementById("localization").value;
    url += '&sid=' + Math.random();   // Adds a random number to prevent the server from using a cached file
	

	//alert(url);

	// CONSTRACT AJAX OBJECT AND SENT HTTP REQUEST
	sendAjaxRequest(formName, url, title);
}



/*******************************************************************************
 ** Standart funcitons
 *******************************************************************************/

/* get hex value */
function gethex(decimal) {
	return "%" + hexchars.charAt(decimal >> 4) + hexchars.charAt(decimal & 0xF);
}

/* encode URL */
function urlEncode( str ) {
	var decoded = str;
	var encoded = "";
	var notascii = "";

	for (var i = 0; i < decoded.length; i++ ) {
		var ch = decoded.charAt(i);
		if (unreserved.indexOf(ch) != -1)	{
			encoded = encoded + ch;
		} else	{
			var charcode = decoded.charCodeAt(i);
			encoded = encoded + gethex(charcode);
	    }
	}
	return encoded;
}


/*  reset security image */
function setCaptcha(responseMessage, formName) {
    var dateObj = new Date();
	var timestamp = dateObj.getTime()
	
	responseMessage.innerHTML = document.getElementById("lsecurity_letters").value.toUpperCase();
	document.getElementById(formName+'_sec_letter_img').src = '../img.php?ts='+timestamp;
	document.getElementById(formName+'_sec_letter').value = '';
}	


/* Convert to English date format: dd/mm/yyyy to yyyy-mm-dd */
function makeEnglishDate(fields) {
    var retval = ""; // returns string
    
    var name = document.getElementById(fields[0]);
    for (var i = (fields.length - 1); i >= 0; i-- ) {
        var name = document.getElementById(fields[i]);
        retval += name.options[name.options.selectedIndex].value + (i == 0 ? '' : '-');
    }
    return retval; 
}




/**********************************************************
 ** Validational Functions
 **********************************************************/

/* compares email string */
function isSameEmail(xmlHttp, field1, field2, lblEmail, lblEmailCopy) {
    var retval = true;
    
	if (document.getElementById(field1).value != document.getElementById(field2).value)  { 
	   xmlHttp.innerHTML = document.getElementById("lemail_match").value.toUpperCase();		
	   document.getElementById(lblEmail).style.color = '#ff0000';
	   document.getElementById(lblEmailCopy).style.color = '#ff0000';
	   retval = false;
    }
    return retval;
}

/* validate email address and its conformation */
function isValidEmailAddress(xmlHttp, email_field, email_label, values, labels) {
	var confirm = 0;
	var number = values.length;
	var retval = true;
	
	// find confirm email field
    for (var i = 0; i < number; i++) {
		if (values[i].match("confirm_email")) {
		   
		   confirm = i; // set confirm email index    
		   break;       // braek confirm email loop
		}
	} // end for
    
    // is valid email field
	if (isValidEmail(xmlHttp, email_field, email_label) == false) retval = false; 
	// is valid confirm email field
	if (confirm && retval && isValidEmail(xmlHttp, values[i], labels[i]) == false) retval = false;
	// is email fields are the same
	if (confirm && retval && isSameEmail(xmlHttp, email_field, values[i], email_label, labels[i]) == false) retval = false;
	
	return retval;
}

/* basic validation of email address */
function isValidEmail(xmlHttp, field, label) {
	
	var email = document.getElementById(field).value;
	
	REG_EMAIL = /^[a-z0-9\-_.]{2,}\@[a-z0-9\-_]{2,}\.[a-z]{2,5}$/i
    var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    var retval = (filter.test(email) ? true : false);
	var labelValue = document.getElementById(label).innerHTML;
	
    if (retval == false)  {
	   var message = document.getElementById("lemail_format").value;
       message = message.replace(/\[label\]/, labelValue);
	   xmlHttp.innerHTML = message.toUpperCase();		
	   document.getElementById(label).style.color = '#ff0000';
    }
    return retval;
}

/* validate country-state-province selection */
function isValidCountryStateProvince(xmlHttp, field, label, formName) {
	var country =  document.getElementById(field);
	var stateBlock = document.getElementById(formName + '_stateBlock');
	var province = document.getElementById(formName + '_spCanada');
	var state =  document.getElementById(formName + '_spUsa');
	var spcMsg = document.getElementById(formName + '_spcMsg');	
	var StateProvinceDD = (country.options.selectedIndex == "1" ?  province : state);
	var retval = isValidCountry(xmlHttp, country, StateProvinceDD, label, spcMsg, stateBlock);
	/*
	var StateProvinceDD = (country.options[country.options.selectedIndex].value == "Canada" ?  province : state);
	var retval = isValidCountry(xmlHttp, country, StateProvinceDD, label, spcMsg, stateBlock);
	*/
	return retval;
}

/* validates selection of country, state/province KG */
function isValidCountry(xmlHttp, countryDD, stateDD, lblCountry, lblStateProvince, stateContainer) {
    var retval = true;
    lblStateProvince.color = "#000066";
    
    // validate country selection
    if (countryDD.options[countryDD.options.selectedIndex].value == '')   {
		lblCountry.color = 'red';  
		retval = false;    
    }
    
    // validate state or province selection
	if (retval && stateContainer.style.display == "inline")
	{
	    if (stateDD.options[stateDD.options.selectedIndex].value == '')   {
	       lblStateProvince.color = 'red';
	       retval = false;		
	    }  
	    else  {
	       retval = stateDD.options[stateDD.options.selectedIndex].value;
	    }
	}
    if (retval == false) xmlHttp.innerHTML = document.getElementById("lrequired_fields").value.toUpperCase();	
    
    return retval;
}

/* validates birthday selection */
function isValidBirthday(fields, lblBirthDay) {
    var retval = true;
    
    for (var i = 0; i < fields.length; i++ ) {
        var name = document.getElementById(fields[i]);
        if (name.options[name.options.selectedIndex].value == '') {
		    document.getElementById(lblBirthDay).style.color = '#ff0000';
		    retval = false;
		    break;
        }
    }
	return retval;
}

/* Checks whether field from drop down box is selected */
function isSelected(field, label) {
    var name = document.getElementById(field);
	var retval = true;
	alert('my test');
	//alert(name.options[name.options.selectedIndex]);
    if (name.options[name.options.selectedIndex].value == '' || name.options[name.options.selectedIndex].value == 'Select') {	
		label.color = '#ff0000';
        retval = false;
    }
    return retval;
}

/* Validate Pet Name */
function isValidPet(xmlHttp, field, label) {
    var labelValue = document.getElementById(label).innerHTML;
    var pet_name = document.getElementById(field).value;
    var retval = true;
    
  	if (document.getElementById(field).value.length < 3) {
    	printErrorMessage(xmlHttp, label, labelValue, 3);
		retval = false;
  	} 
        else if (pet_name.match(/[^a-zA-Z0-9_ ]/)) {
    	    printErrorMessage(xmlHttp, label, labelValue, 0);
   	    retval = false;
        }

    /* natalia roque, add */
  	/* else if (pet_name.match(/\W/)) {
    	printErrorMessage(xmlHttp, label, labelValue, 0);
		retval = false;
  	}*/

  	return retval;
}

/* Validate Room Name */
function isValidRoomName(xmlHttp, field, label) {
    var labelValue = document.getElementById(label).innerHTML;
    var room_name = document.getElementById(field).value;
    var retval = true;
    
	/* natalia roque, add */
  	/*if (room_name.match(/\W/)) {
    	printErrorMessage(xmlHttp, label, labelValue, 0);
		retval = false;
  	}*/

    if (room_name.match(/[^a-zA-Z0-9_ ]/)) {
    	    printErrorMessage(xmlHttp, label, labelValue, 0);
   	retval = false;
    }


  	return retval;
}

/* Validate Item */
function isValidItem(xmlHttp, field, label) {
    var labelValue = document.getElementById(label).innerHTML;
    var item_name = document.getElementById(field).value;
    var retval = true;
    
    if (document.getElementById(field).value.length < 3) {
    	printErrorMessage(xmlHttp, label, labelValue, 3);
		retval = false;
  	} 
  	
    // match any single non-word character. Equivalent to [^a-zA-Z0-9_]
    else if (item_name.match(/[^a-zA-Z0-9_ ]/)) {
    	printErrorMessage(xmlHttp, label, labelValue, 0);
		retval = false;
  	}
  	return retval;
}


/* Validate User  Name  */
function isValidUserName(xmlHttp, field, label) {
    var labelValue = document.getElementById(label).innerHTML;
    var user_name = document.getElementById(field).value;
    var retval = true;
    
  	if (document.getElementById(field).value.length < 3) {
    	printErrorMessage(xmlHttp, label, labelValue, 3);
		retval = false;
  	}
    else if (user_name.match(/\W/)) {
    	printErrorMessage(xmlHttp, label, labelValue, 0);
		retval = false;
  	}
  	return retval;
}

/* Validate Text area  */
function isValidDescription(xmlHttp, field, label) {
	var textLength = document.getElementById(field).value.length;
	var retval = true;
	if (textLength > 300) {
    	var message = document.getElementById("lmessage_length").value;
        message = message.replace(/\[length\]/, (textLength - 300));
        message = message.replace(/\[plural\]/, document.getElementById("lplural_char").value);
		xmlHttp.innerHTML = message.toUpperCase();
		document.getElementById(label).style.color = '#ff0000';
		retval = false;
  	}
  	return retval;
}
        	
/* Print error message  */
function printErrorMessage(xmlHttp, label, labelValue, length) {
    
    if (length > 0) {
         var message = document.getElementById("lchar_length").value;
         message = message.replace(/\[label\]/,labelValue);
         message = message.replace(/\[length\]/, length);
         xmlHttp.innerHTML = message.toUpperCase();
    } else {
        var message = document.getElementById("lchar_type").value;
        message = message.replace(/\[label\]/,labelValue);
        xmlHttp.innerHTML = message.toUpperCase();
    }
    document.getElementById(label).style.color = '#ff0000';
}

/**********************************************************
 ** Send AJAX request
 **********************************************************/
function sendAjaxRequest(formid, url, title) { 
	// Constract AJAX object
	var xmlHttp;
	xmlHttp=GetXmlHttpObject();
	if (xmlHttp==null) {
        alert ("Browser does not support HTTP Request");
	    return;
 	} 
	
	// Send HTTP Request
	xmlHttp.onreadystatechange=function() { getHTTPRequest(xmlHttp, formid, title); }; 
	xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
}

// Handle HTTP Request
function getHTTPRequest(xmlHttp, formName, title)
{
	var responseMessage = document.getElementById(formName + '_error');
    
	if(xmlHttp.readyState == 4 || xmlHttp.readyState=="complete")
	{
		
		if(xmlHttp.status == 200)
		{
			
			// responseMessage.innerHTML = 'my response: ' + xmlHttp.responseText;
			
			var response = xmlHttp.responseText.split(";");
			// Error Response
	//		alert(response);
			if(response[1] == 0) {
			    if (response[0] == 'INCORRECT_CAPTCHA') {
			        setCaptcha(responseMessage, formName);
			    }    
			    else {
			        // response[0]; 
					responseMessage.innerHTML = document.getElementById("laccount_match").value.toUpperCase();
				}
				document.getElementById(formName + '_reqbutton').disabled = false
				return;
			} 
			// System Error
			else if (response[1] == 2) {
			    responseMessage.innerHTML = "INTERNAL ERROR PLEASE CONTACT SYSTEM ADMINISTRATOR<hr noshade size=1>" + response[0];
				document.getElementById(formName + '_reqbutton').disabled = false;
				return;
			}
			// Old Account
			// don't store in ticket system and don't send message if the account pass ro days, form i5
			else if (response[1] == 3) {
			    responseMessage.innerHTML = document.getElementById("laccount_old").value.toUpperCase();
				document.getElementById(formName + '_reqbutton').disabled = false;
				return;
			}
			else if (response[1] == 4) {
				responseMessage.innerHTML = document.getElementById("lemail_notsend").value.toUpperCase(); 
				document.getElementById(formName+'_reqbutton').disabled = false;
			}  
			else if (response[1] == 5) {
				responseMessage.innerHTML = document.getElementById("ldeluxe_membership").value.toUpperCase(); 
				document.getElementById(formName+'_reqbutton').disabled = false;
			} else {	
				responseMessage.innerHTML = document.getElementById("lemail_send").value.toUpperCase();
				document.getElementById(formName + '_reqbutton').style.display = 'none';
			}
			
			
			// natalia roque, cancel go to sendmail.php trough ajax, performance time sending mail
			// Looks Kosher submit email and print conformation line 
			/*else {
				// responseMessage.innerHTML = document.getElementById("lrequest_ready").value.toUpperCase();
				responseMessage.innerHTML = document.getElementById("lemail_send").value.toUpperCase();
				document.getElementById(formName + '_reqbutton').style.display = 'none';
			}
            
			var firstName = document.getElementById(formName + '_firstname');
			if (firstName == null) { firstName =  document.getElementById(formName + '_username'); }
			var email = document.getElementById(formName + '_email');
            
			var messageValues = "";
			messageValues += "title=" + title;
			messageValues += "&firstName=" + urlEncode( firstName.value );
			messageValues += "&email=" + urlEncode( email.value );
			messageValues += "&localization=" +document.getElementById("localization").value;
			
			*/

			// recover user name
			//if (response[0] == "username") {
			//	messageValues += "&username=" +response[1];
			//} 

			//sendemail(formName, messageValues);



		}
		
		// Server Response Error 
		else {
			responseMessage.innerHTML = 'SYSTEM ERROR: ' + xmlHttp.statusText;
		}
		
	}
}

			
// Get xml http object
function GetXmlHttpObject()
{
	var httpRequest;

	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			httpRequest.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if (!httpRequest) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	return httpRequest;
}

