// Generic function to validate forms
// requires 'validate' attribute in input element, with function and upto 2 parameters.
// (c) c360uk Ltd.  2003-2005
function validate(formObj)
{
    var booErrorFound = false;
    
    for (var i = 0; i<formObj.elements.length; i++)
    {
    	var ele=formObj.elements[i];
    	if(ele.getAttribute("validate"))
    	{
    	    var arrValidation = validationType = ele.getAttribute("validate").split(",");
    		validationMethod = arrValidation[0];
    		validationParam1 = arrValidation[1];
    		validationParam2 = arrValidation[2];						
    		
            //alert('Validating: '+ele.name+', validation method: '+validationMethod);
            
    		switch (validationMethod)
    		{
				case "age":
                    var intMinimumAge   = parseInt(validationParam1);
                    arrDateValue = ele.value.split('-');
                    var year  = parseInt(arrDateValue[0],10);
                    var month = parseInt(arrDateValue[1],10) - 1;
                    var day   = parseInt(arrDateValue[2],10);
                    var theirAge = new Date((year + intMinimumAge), month, day);
                    var today    = new Date;
                    
                    if(theirAge.getTime()>0) {
                    
						if (document.getElementById('err'+ele.getAttribute("name"))) {
							document.getElementById('err'+ele.getAttribute("name")).style.display='none'; 
						}
                        
                        timeDifference = today.getTime() - theirAge.getTime();
                        
                        if (timeDifference < 0) {
                            
                            if(document.getElementById(validationParam2).checked) {  // Age is lower than required, checkbox ticked!
                            	if (document.getElementById('err'+validationParam2)) { 
                    	            document.getElementById('err'+validationParam2).style.display='none';
                        	    }
                            }
                            else { // Age is lower than required, checkbox not ticked!
                                booErrorFound = true;
                            	if (document.getElementById('err'+validationParam2)) { 
                    	            document.getElementById('err'+validationParam2).style.display='block'; 
                        	    }
                            }
                        }
                        else { // Age fits the requirement!
                            if (document.getElementById('err'+validationParam2)) { 
                   	            document.getElementById('err'+validationParam2).style.display='none'; 
                       	    }
                        }
                    }
                    else { // Date entered is incorrect!
                    	booErrorFound = true;
						if (document.getElementById('err'+ele.getAttribute("name"))) {
							document.getElementById('err'+ele.getAttribute("name")).style.display='block'; 
						}
                    }
				    break;
					
                case "date":
                    arrDateValue = ele.value.split('-');
					var month = parseInt(arrDateValue[1],10).toString();
                    if(ele.value=='' || arrDateValue[0]=='YYYY' || arrDateValue[0]=='0000' || arrDateValue[0]==''
                       || arrDateValue[1]=='MM' || arrDateValue[1]=='00' || arrDateValue[1]==''  || month=="NaN"
                       || arrDateValue[2]=='DD' || arrDateValue[2]=='00' || arrDateValue[2]=='') 
                    { 
                        booErrorFound = true; 
                        if (document.getElementById('err'+ele.getAttribute("name"))) { 
                            document.getElementById('err'+ele.getAttribute("name")).style.display='block';
                        }
                    } else if (document.getElementById('err'+ele.getAttribute("name"))) {
					    document.getElementById('err'+ele.getAttribute("name")).style.display='none';
					}
                    break;
				
				case "birthday":
                    arrDateValue = ele.value.split('-');
					 var month = parseInt(arrDateValue[1],10).toString();
					 //alert(month);
                    if(ele.value=='' || arrDateValue[1]=='MM' || arrDateValue[1]=='00' || arrDateValue[1]=='' || month=="NaN"
                       || arrDateValue[2]=='DD' || arrDateValue[2]=='00' || arrDateValue[2]=='') 
                    { 
                        booErrorFound = true; 
                        if (document.getElementById('err'+ele.getAttribute("name"))) { 
                            document.getElementById('err'+ele.getAttribute("name")).style.display='block';
                        }
                    } else if (document.getElementById('err'+ele.getAttribute("name"))) {
					    document.getElementById('err'+ele.getAttribute("name")).style.display='none';
					}
                    break;
				
                case "email":
                    if (!isValidEmail(ele.value,validationParam1))
                    {
                        ele.className="textboxerror";
                        booErrorFound = true;
                        if (document.getElementById('err'+ele.getAttribute("name"))) { 
                            document.getElementById('err'+ele.getAttribute("name")).style.display='block';
                        }
                    } else if (document.getElementById('err'+ele.getAttribute("name"))) {
					    document.getElementById('err'+ele.getAttribute("name")).style.display='none';
					}
                    break;
                case "equals":
					//alert("Come to equal");
                    if (validationParam1 == "element")
                    {
                        var ele2 = formObj[validationParam2];
                        if (ele.value != ele2.value)
                        {
							//alert("Not equal: "+ele.value+' <> '+ele2.value);
                            ele.className="textboxerror";
                            booErrorFound = true;
							if (document.getElementById('err'+ele.getAttribute("name"))) { 
                         	   document.getElementById('err'+ele.getAttribute("name")).style.display='block';
                        	}
                        } else {
							if (document.getElementById('err'+ele.getAttribute("name"))) { 
								document.getElementById('err'+ele.getAttribute("name")).style.display='none';
							}
						}
                    }
                    else if (validationParam1 == "value")
                    {
                        if (ele.value != validationParam2)
                        {
                            ele.className="textboxerror";
                            booErrorFound = true;
                        }
                    }
                    break;
                case "length":
                    if (ele.value.length<validationParam1 || ele.value.length>validationParam2)
                    {
                        ele.className="textboxerror";
                        booErrorFound = true;
                    }
                    break;
                case "mobile":
					//alert("Validate Mobile");
					if (!isValidMobile(ele.value)) 
					{
                        ele.className="textboxerror";
                        booErrorFound = true;
                        if (document.getElementById('err'+ele.getAttribute("name"))) { 
                            document.getElementById('err'+ele.getAttribute("name")).style.display='block' 
                        }
                    } else if (document.getElementById('err'+ele.getAttribute("name"))) {
					    document.getElementById('err'+ele.getAttribute("name")).style.display='none'
					}	
					break;
				case "populated":
				    if (ele.value.length<1 || ele.value==' ' || ele.value=='  ' || ele.value=='   ')
					{
						ele.className="textboxerror";
						if (document.getElementById('err'+ele.getAttribute("name"))) {document.getElementById('err'+ele.getAttribute("name")).style.display='block'}
						booErrorFound = true;
					}
					else {
					    if (typeof validationParam1 != "undefined") {
					        if (charactersCheck(ele.value,validationParam1)) {
					        }
					        else {
					            booErrorFound = true;
					        }
					    }
					    ele.className="";
					    if (document.getElementById('err'+ele.getAttribute("name"))) {document.getElementById('err'+ele.getAttribute("name")).style.display='none'}
					}
					break; 
                case "radio":
                    var radioSelected = -1;
                    var radioGroup    = ele.name;
                    var radioButtons  = formObj.elements[radioGroup];
                    for (j=0;j<radioButtons.length; j++) {
                        if (radioButtons[j].checked) {
                            radioSelected = j;
                        }
                    }
                    if (radioSelected == -1) {
                        ele.className="textboxerror";
                        booErrorFound = true;
                        if (document.getElementById('err'+ele.getAttribute("name"))) { 
                            document.getElementById('err'+ele.getAttribute("name")).style.display='block' 
                        }
                    } else if (document.getElementById('err'+ele.getAttribute("name"))) {
					    document.getElementById('err'+ele.getAttribute("name")).style.display='none'
					}
                    break; 
    		}
    		
        }
    }
    
    if (booErrorFound == true)
    {
        alert("You have not filled in all required fields correctly.");
        return false;
    }
    else {
        return true;
    }
}

function isValidMobile(mob) {
	if((!IsNumeric(mob)) || mob.length != "11" || mob.substring(0,2) != "07") {
		return false;
	}
	return true;
}

function IsNumeric(strString)
	// check for valid numeric strings
{
	var strValidChars = "0123456789.-";
	var strChar;
	var blnResult = true;
	
	if (strString.length == 0) return false;
	
	// test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++)
	{
		strChar = strString.charAt(i);
		if (strValidChars.indexOf(strChar) == -1)
		{
			blnResult = false;
		}
	}
	return blnResult;
} 

function isValidPeriod(beginDate, endDate) {
	return (endDate >= beginDate);
}
// Check that an email address is valid based on RFC 821
function isValidEmail(address, optional) {
   if (address != '' && address.search) {
      if (address.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) return true;
      else return false;
   }
   // allow empty strings to return true if optional
   else return optional;
}

function openWindow(url, width, height, scrollbars, menubar, windowName) {
    var Win = window.open(url,windowName,'width=' + width + ',height=' + height + ',resizable=yes,scrollbars=' + scrollbars + ',menubar=' + menubar );
    Win.creator=self;
}

function addToQuery(varName, varValue, varURI)
{
	var objParams = new Array();
	var objValues = new Array();
	var arrNewQuery = new Array();
        var booMatched = false;
        var strOutput;
	
	this.URI = arguments[2];
    if (this.URI==null)  // not specified
      this.URI = window.location;

	var q = this.URI.search;
	
	if(q.length > 1) 
	{
	    q = q.substring(1, q.length);
	}
	else 
	{
	    q = null;
    }


    keyValuePairs = new Array();

    if(q) 
	{
        for(var i=0; i < q.split("&").length; i++) 
		{
            keyValuePairs[i] = q.split("&")[i];

			var strName  = keyValuePairs[i].split("=")[0];
			var strValue = keyValuePairs[i].split("=")[1];
			objParams[i] = strName;
			//alert (varName + " " + strName);
			if (varName==strName)
			{
				//alert (varValue);
				objValues[i] = varValue;
                                booMatched = true;
			}
			else
			{
			    objValues[i] = strValue;			
			}
			arrNewQuery[i] = strName + "=" + objValues[i];
		}
	}
	
	if (booMatched==false)
	{
		arrNewQuery.push(varName + "=" + varValue + "&");
	}
	
        strOutput = arrNewQuery.join("&");	

	strOutput = this.URI.protocol + "//" + this.URI.hostname + this.URI.pathname + "?" + strOutput;
	
        //alert(strOutput);
	return strOutput;
}

function maxlengthTextarea(obj){
    var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
    if (obj.getAttribute && obj.value.length>mlength)
    obj.value=obj.value.substring(0,mlength)
}

function textCounter(field,cntfield,maxlimit) {
    if (field.value.length > maxlimit) {
        field.value = field.value.substring(0, maxlimit);
    } else {
        cntfield.value = maxlimit - field.value.length;
    }
}
    
function scrollDiv(objDiv,intScroll) {
    
    var divHeight    = objDiv.scrollHeight; // Actual Div Height
    
	var divPosition  = objDiv.scrollTop;
	var scrollTarget = divPosition + intScroll;
	
	if (scrollTarget > divHeight) {
	    var scrollTarget = divHeight;
	}
	else if (scrollTarget < 0) {
	    var scrollTarget = 0;
	}
	//alert('DivHeight = '+divHeight+', Scroll target is '+scrollTarget+' (moving from '+divPosition+' by '+intScroll+')');
	var intStep = scrollTarget - divPosition;
	if (intStep >= 0) {
    	if (intStep > 10) {
    	    var realStep = 6;
    	}
    	else if (intStep >6) {
    	    var realStep = 3;
    	}
    	else if (intStep > 2) {
    	    var realStep = 2;
    	}
    	else if (intStep > 0) {
    	    var realStep = 1;
    	} 
    	else {
    	    var realStep = 0;
    	}
	} else {
    	if (intStep < -10) {
    	    var realStep = -6;
    	}
    	else if (intStep < -6) {
    	    var realStep = -3;
    	}
    	else if (intStep < -2) {
    	    var realStep = -2;
    	}
    	else if (intStep < 0) {
    	    var realStep = -1;
    	}
    	else {
    	    var intStep = 0;
    	}
	}
	
    objDiv.scrollTop = divPosition + realStep;
    
    if(objDiv.scrollTop != scrollTarget) {
        var toScroll = intScroll - realStep;
        //alert('Left to scroll '+toScroll+' Scroll target:'+scrollTarget+' Current position: '+objDiv.scrollTop);
        scrollTimer  = setTimeout("scrollDiv(document.getElementById('" + objDiv.id+ "')," + toScroll + ")",10);
    }
}

function addToCart(ItemId, Quantity, StockId) {

    var fieldId     = 'Quantity-'+ItemId+'-'+StockId+'';
    var NewQuantity = document.getElementById(fieldId).value;
    
    document.forms['frmAddToCart'].ItemId.value         = ItemId;
    document.forms['frmAddToCart'].ItemQuantity.value   = NewQuantity;
    document.forms['frmAddToCart'].StockId.value        = StockId;
    
    if (document.forms['frmItemPersonalisation']) {
        if (document.forms['frmItemPersonalisation'].ItemPersonalisation.length > 1) {
            for (var i = 0; i < document.forms['frmItemPersonalisation'].ItemPersonalisation.length; i++) {
                if (document.forms['frmItemPersonalisation'].ItemPersonalisation[i].value) {
                    document.forms['frmAddToCart'].Personalisation.value =  document.forms['frmItemPersonalisation'].ItemPersonalisation[i].value + '|' + document.forms['frmAddToCart'].Personalisation.value;
                    document.forms['frmAddToCart'].PersonalisationPrice.value =  document.forms['frmItemPersonalisation'].ItemPersonalisationPrice[i].value + '|' + document.forms['frmAddToCart'].PersonalisationPrice.value;
                }
            }
        } else {
            if (document.forms['frmItemPersonalisation'].ItemPersonalisation.value) {
                document.forms['frmAddToCart'].Personalisation.value = document.forms['frmItemPersonalisation'].ItemPersonalisation.value;
                document.forms['frmAddToCart'].PersonalisationPrice.value = document.forms['frmItemPersonalisation'].ItemPersonalisationPrice.value;
            }
        }
    }
    
    if (document.getElementById('RequireConstituency').value == 'Y') {
        if (document.getElementById('ConstituencyId_' + ItemId).value == 0) {
            alert('Please choose constituency prior to adding item to basket.');
            return false;
        } else {
            document.forms['frmAddToCart'].ConstituencyId.value = document.getElementById('ConstituencyId_' + ItemId).value;
            document.forms['frmAddToCart'].submit();
            return true;
        }
    } else {
        document.forms['frmAddToCart'].submit();
        return true;
    }
    
}

function performSearch() {
    
    document.forms['frmSearch'].submit();
    return true;
    
}

function updateBasket() {
    
    document.forms['frmBasketContents'].submit();
}

function copyAddresses() {
    
    document.getElementById('BillingPersonName').value = document.getElementById('DeliveryPersonName').value;
    document.getElementById('BillingHouseName').value  = document.getElementById('DeliveryHouseName').value;
    document.getElementById('BillingAddress1').value   = document.getElementById('DeliveryAddress1').value;
    document.getElementById('BillingAddress2').value   = document.getElementById('DeliveryAddress2').value;
    document.getElementById('BillingAddress3').value   = document.getElementById('DeliveryAddress3').value;
    document.getElementById('BillingTown').value       = document.getElementById('DeliveryTown').value;
    document.getElementById('BillingCounty').value     = document.getElementById('DeliveryCounty').value;
    document.getElementById('BillingPostcode').value   = document.getElementById('DeliveryPostcode').value;
    
}