/* ==========================================================
Tools Site Javascript Functions

This file contains all javascript functions for PHP version of Tools Site.
Any site-wide script should be placed here. Custom or page-specific
javascript should be created in dedicated javascript files and loaded
as required.

version:   0.1
author:    Sam Hocking
website:   http://www.parkertools.co.uk
============================================================ */

var noOfPartners = 1; // holds number of partners the user has displayed in Account application form.

/* General window popping function. Handles all scenarios

Usage: <a href="#" onclick="openNewWindow('http://www.google.com/', 'Google', '710','548',true,'scrollbars=no, toolbar=no');" > Popup </a>
============================================================ */

function openNewWindow(url, name, width, height, center, options ) {
	var win;
	var l;
	var t;
	if(center){
		l = (screen.width-width)/2;
		t = (screen.height-height)/2;
	}
	var settings = "height=" + height + ", width=" + width + ", top=" + t + ", left=" + l + ", " + options;
	win = window.open(url,name,settings);
	win.focus();
}


/* Toggle element (display: block/none) or (visibility: visible/hidden) */ 
function toggleMe(me, cssProperty){
	var property = eval(cssProperty);
	if (cssProperty == "display") {
		if (me.style.display == "block") {
			me.style.display = "none";
		} else if (me.style.display == "none") {
				me.style.display = "block";
		}
	} else if (cssProperty == "visibility") {
		if (me.style.visibility == "visible") {
			me.style.visibility = "hidden";
		} else if (me.style.visibility=="hidden") {
			me.style.visibility = "visible";
		}
	}
}


/* Quick search processing  */ 
function quickSearch(vID, sts) {
	var searchStr = document.getElementById("searchBox").value;
	searchStr = searchStr.replace(/-/g, "");
	if(isNaN(searchStr)) {
		location.replace('/ProductResults.php?str=' + searchStr + '&lvl=1');
	} else {
		location.replace('/StockResults.php?str=' + searchStr);
	}  
}


/* Advanced search processing */ 
function advancedSearch(type) {
	
	// Handle product search.
	if( type == "product" ) {
		var searchStr = escape(document.getElementById(type).value);
		var sel = document.getElementById("searchCategory");
		var cat = escape(sel.options[sel.selectedIndex].value);
		if ( cat != "" ) {
		    location.replace('/ProductResults.php?str=' + searchStr + '&cat=' + cat + '&lvl=1');
		} else {
			location.replace('/ProductResults.php?str=' + searchStr + '&lvl=1');
		}
    
	// Handle brand search.
	} else if( type == "brand" ) {
		var sel = document.getElementById(type);
		searchStr = sel.options[sel.selectedIndex].value;
		location.replace('/BrandResults.php?str=' + searchStr + '&lvl=1');

    // Handle stock number search. 
	} else if( type == "stock" ) {
		searchStr = escape(document.getElementById(type).value);
	    location.replace('/StockResults.php?str=' + searchStr);
	   
	// Handle part number search.
	} else if( type == "part" )  {
		searchStr = escape(document.getElementById(type).value);
        location.replace('PartResults.php?str=' + searchStr);
	}
}


/* Check numeric entry */ 
function checkNumeric(id) {
   var val = document.getElementById(id).value;
   if(isNaN(val)) {
	   alert("Please enter only numeric values");
	   document.getElementById(id).value = "";
	   document.getElementById(id).focus();
   }
}



/* Limit form submission to once. */ 
var form_submitted = false;
function submit_form() {
    if ( form_submitted ) {
        alert ( "Updating quantities & totals. Please wait..." );
        return false;
    } else {
        form_submitted = true;
        return true;
    }
}
  


/* Limit text entry in text area */
function textAreaLimit(id,limit) {
	var area = document.getElementById(id);
	if (area.value.length > limit) {
		area.value = area.value.substring(0, limit);
		alert("You have reached the text entry limit.");
	}
}

/* Handle offers per page on the special offers page */
function changeNumPerPage(f) {
	f.page.value = 1; 
	f.submit();
}

function getClientHeight() {
    var myHeight = 0;
	if( typeof( window.innerHeight ) == 'number' ) {
	   //Non-IE
	    myHeight = window.innerHeight;
	} else if( document.documentElement && document.documentElement.clientHeight ) {
	    //IE 6+ in 'standards compliant mode'
	    myHeight = document.documentElement.clientHeight;
	} else if( document.body && document.body.clientHeight ) {
	    //IE 4 compatible
	    myHeight = document.body.clientHeight;
	}
	return myHeight;
}


/* Handle table display and pagination when displaying products from searches */  
function productPaging (curPag,totPag,totRow,perPag) {
	var objPage;
	var objControl;
	var objControl2;
	var objPaging; 
	var objTable; 
	var hgt; 
	var row;
	var pageStart; 
	var pageEnd;
	
	var browser = detectBrowser();
	
	// Set default table height; 
	objTable = document.getElementById("productsContent");
	if (perPag == 20) {
		if ( browser == "IE" ) {
	        objTable.style.height = "845";
		} else {
	        objTable.style.height = "860px";
		}
	} else if (perPag == 50) {
		if ( browser == "IE" ) {
	        objTable.style.height = "2045";
		} else {
		    objTable.style.height = "2060px";
		}
	} else if (perPag == 100) {
		if ( browser == "IE" ) {
	        objTable.style.height = "4045";
		} else {
		    objTable.style.height = "4060px";
		}
	}
	
    for( var i = 1; i <= totPag; i++ ) { 
    	objPage     = document.getElementById("prodPage" + i);
    	objControl  = document.getElementById("prodControlA" + i);
    	objControl2 = document.getElementById("prodControlB" + i);
	    if( i == curPag ) {
	        objPage.style.display = "block";
	       
	        // Style page controls. 
	        if( totPag > 1) {
	            objControl.style.fontWeight  = "bold";
	            objControl2.style.fontWeight = "bold";
	        }
	        
	        // Set height of table. 
	        if( curPag == totPag ) {
	            row = totRow - ((totPag-1)*perPag);
	            if ( browser == "IE" ) {
	            	hgt = (row * 40) + 45;
	    		} else {
	                hgt = (row * 40) + 60;
	    		}
	            objTable = document.getElementById("productsContent");
	            objTable.style.height = hgt + "px";
	        }
	    } else {
	    	objPage.style.display = "none";
	    	
	    	// Style page controls.
	    	if ( totPag > 1) {
	    	    objControl.style.fontWeight  = "normal";
	    	    objControl2.style.fontWeight = "normal";
	    	}
	    }
    }
      
    // Show page controls. 
    objPaging = document.getElementById("productsPaging");
    objPaging.style.visibility = "visible";
    
    // Initialize current page hidden field. 
    // document.getElementById('currPage').value = curPag;
    document.getElementById('page').value = curPag;
    
    // Output page totals? 
    pageEnd = curPag * perPag; 
    if( pageEnd > totRow) {
     	pageEnd = totRow;
    }
    pageStart = ((curPag-1)*perPag) + 1;
    if ( totPag > 1 ) {
        document.getElementById("productsResults").innerHTML = "Showing " + pageStart + " to " + pageEnd + " of " + totRow;
        document.getElementById("productsResults2").innerHTML = "Showing " + pageStart + " to " + pageEnd + " of " + totRow;
    }
}


function detectBrowser() {
	var browserName = navigator.appName;
	if ( browserName =="Microsoft Internet Explorer" ) {
		return "IE"; 
	} else { 
		return "";
    }	
}


function allFormProducts (grp,cls) {
	var sel = document.getElementById("showForms");
	var frm = sel.options[sel.selectedIndex].value;
    var dsc = sel.options[sel.selectedIndex].text;
    location.replace('/AllProducts/' + grp + '/' + cls + '/' + frm);       
}


/* Clear FastOrder Form */
function clearFastOrder(itemToClear) {
    for (var i=1;i<=5;i++) {
        if(itemToClear == "stockNo") {
            for(var j=1;j<=3;j++) {
                //clear stock numbers
                document.getElementById(itemToClear + i + "_" + j).value='';
            }
            // clear stock number quantities
            document.getElementById(itemToClear + "Qnty" + i).value='';
            // clear messages
            document.getElementById(itemToClear + i + "Message").innerHTML='';
        } else if(itemToClear == "myPartNo") {
            // clear my part numbers
            document.getElementById(itemToClear + i).value='';
            // clear my part number quantities
            document.getElementById(itemToClear + "Qnty" + i).value='';
            // clear messages
            document.getElementById(itemToClear + i + "Message").innerHTML='';
        }
    }
}


/* Proceed with order from the shopping basket. */ 
function proceedOrder(f,vid,sts,flgs) {
	var num = f.custOrdNum.value; 
	var dsc = f.orderDesc.value;
	var path = "/macros/Delivery.mac/Delivery?VisitorID=" + vid + "&Status=" + sts + "&IO_Stock_All=" + flgs + "&CustOrdNum=" + num + "&CustOrdDesc=" + dsc;
	
	location.replace("/macros/Delivery.mac/Delivery?VisitorID=" + vid + "&Status=" + sts + "&IO_Stock_All=" + flgs + "&CustOrdNum=" + num + "&CustOrdDesc=" + dsc);
}


/* Save basket from the shopping basket. */ 
function saveBasket(f) {
	var num = f.custOrdNum.value; 
	var dsc = f.orderDesc.value; 
	location.replace("/SaveBasket?CustOrdNum=" + num + "&CustOrdDesc=" + dsc);
}



//supplementary AJAX functions to validate FindAddress in Registration forms
var findAddressURL;
var outputTD;
var addressGroup;

function findAddress(postcode, output, address) {
	outputTD = output;
	addressGroup = address;
	if (document.getElementById) {
		findAddressURL = "/FindAddress.php?postcode=" + postcode;
		getAddresses();
		document.body.style.cursor = "wait";
		document.getElementById(outputTD).innerHTML = "<span class=\"red\">Retrieving addresses for " + postcode.toUpperCase() + "...</span>";
	}
}

//Get Addresses
function getAddresses() {
 var meth = "GET";
 var str = null;
 
 try {
     // post the data and wait for response
     getXMLAddresses(findAddressURL, meth, str);
 } catch(e) {
     var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error");
     alert("Sorry, there was a problem fetching any addresses. Please try again.");
     document.getElementById(outputTD).innerHTML = "";
     return;
 }
}

//Fetch the XML Request
function getXMLAddresses(file, meth, str) {
 var doc = null;
 if (typeof window.ActiveXObject != 'undefined' ) {
     xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
     xmlReq.onreadystatechange = displayAddressesState;
 } else {
     xmlReq = new XMLHttpRequest();
     xmlReq.onload = displayAddressesState;
 }
 xmlReq.open( meth, file, true ); 
 xmlReq.send(str);
}

//Handle onreadystatechange event of req object
function displayAddressesState() {
 // only if req shows "loaded"
 if (xmlReq.readyState == 4) {
     // only if "OK"
     if (xmlReq.status == 200) {
	        if (xmlReq.responseText.length <= 3) {
	        	document.getElementById(outputTD).innerHTML = "";
	            alert("Sorry, no addresses found matching that postcode, please try again.");
	            document.getElementById("lookup" + addressGroup + "Postcode").focus();
	        } else {
	            document.getElementById(outputTD).innerHTML = xmlReq.responseText;
	        }
     } else {
     	 alert("Sorry, there was a problem fetching any addresses. Please try again.");
     	 document.getElementById(outputTD).innerHTML = "";
     }
 }
 document.body.style.cursor = "default";
}

//Fills the address fields
function fillOutAddress(address) {
	var line = address.split("|");
	document.getElementById('address' + addressGroup + 'Line1').value = line[0];
	document.getElementById('address' + addressGroup + 'Line2').value = line[1];
	if(document.getElementById('address' + addressGroup + 'Line3')) {
		document.getElementById('address' + addressGroup + 'Line3').value = line[2];
	}
	document.getElementById('town' + addressGroup).value = line[3];
	document.getElementById('county' + addressGroup).value = line[4];
	document.getElementById('postcode' + addressGroup).value = line[5] + " " + line[6];
	
	if(document.getElementsByName('statementInvoiceAddress')[1] != undefined) {
		if(document.getElementsByName('statementInvoiceAddress')[1].checked == true) {
			toggleStatementInvoiceAddresses('Company', 'Statement', false);
			toggleStatementInvoiceAddresses('Company', 'Invoice', false);
		}
	}
}

// Toggles registration fields according to company or individual registering
function toggleCompanyFields(status) {
	var title="";
	if(status == true) {
		var title = "This field has been disabled because it only applies if you are a Company";
	}
	document.getElementById('individual').checked = status;
	document.getElementById('companyName').disabled = status;
	document.getElementById('companyName').title = title;
	document.getElementById('jobFunction').disabled = status;
	document.getElementById('jobFunction').title = title;
	document.getElementById('areaOfBusiness').disabled = status;
	document.getElementById('areaOfBusiness').title = title;
}

// Toggles Statment & Invoice address with data from Company Address
function toggleStatementInvoiceAddresses(fromId, toId, clear) {
	var ids = new Array("Statement", "Invoice");
	if(clear == true) {
		if(toId == "both") {
			for(var i=0;i<ids.length;i++) {
				document.getElementById("address" + ids[i] + "Line1").value = "";
				document.getElementById("address" + ids[i] + "Line2").value = "";
				document.getElementById("address" + ids[i] + "Line3").value = "";
				document.getElementById("town" + ids[i]).value = "";
				document.getElementById("county" + ids[i]).value = "";
				document.getElementById("postcode" + ids[i]).value = "";
			}
		} else {
			document.getElementById("address" + toId + "Line1").value = "";
			document.getElementById("address" + toId + "Line2").value = "";
			document.getElementById("address" + toId + "Line3").value = "";
			document.getElementById("town" + toId).value = "";
			document.getElementById("county" + toId).value = "";
			document.getElementById("postcode" + toId).value = "";
		}
		
	} else if(clear == false){
		if(toId == "both") {
			for(var i=0;i<ids.length;i++) {
				document.getElementById("address" + ids[i] + "Line1").value = document.getElementById("address" + fromId + "Line1").value;
				document.getElementById("address" + ids[i] + "Line2").value = document.getElementById("address" + fromId + "Line2").value;
				document.getElementById("address" + ids[i] + "Line3").value = document.getElementById("address" + fromId + "Line3").value;
				document.getElementById("town" + ids[i]).value = document.getElementById("town" + fromId).value;
				document.getElementById("county" + ids[i]).value = document.getElementById("county" + fromId).value;
				document.getElementById("postcode" + ids[i]).value = document.getElementById("postcode" + fromId).value;
			}
		} else {
			document.getElementById("address" + toId + "Line1").value = document.getElementById("address" + fromId + "Line1").value;
			document.getElementById("address" + toId + "Line2").value = document.getElementById("address" + fromId + "Line2").value;
			document.getElementById("address" + toId + "Line3").value = document.getElementById("address" + fromId + "Line3").value;
			document.getElementById("town" + toId).value = document.getElementById("town" + fromId).value;
			document.getElementById("county" + toId).value = document.getElementById("county" + fromId).value;
			document.getElementById("postcode" + toId).value = document.getElementById("postcode" + fromId).value;
		}
	}
}

function customiseApplicationForm(companyType) {
	
	if(companyType == "PLC" || companyType == "LTD" || companyType == "LLP") {
		//show directors
		if(companyType != "LLP") {
			document.getElementById("directors").style.display="block";
			selectOption("positionDirector1","DIR");
			selectOption("positionDirector2","DIR");
			
			// hide rest
			for(var i=1;i<=noOfPartners;i++) {
			document.getElementById("partner" + i).style.display="none";
			}
			document.getElementById("partnerControls").style.display="none";
		}
		document.getElementById('registrationNumberLabel').style.display='';
		document.getElementById('registrationNumberInput').style.display='';
		
		
		document.getElementById("proprietors").style.display="none";
	}
	if (companyType == "Partnership" || companyType == "LLP") {
		//show partners
		document.getElementById("partner1").style.display="block";
		document.getElementById("partnerControls").style.display="block";
		if(companyType == "Partnership") {
			document.getElementById('registrationNumberLabel').style.display='none';
			document.getElementById('registrationNumberInput').style.display='none';
		}
		//noOfPartners=1;
		// hide rest
		document.getElementById("proprietors").style.display="none";
		document.getElementById("directors").style.display="none";
	} else if (companyType == "Sole Trader") {
		// show proprietors
		document.getElementById("proprietors").style.display="block";
		//hide rest
		for(var i=1;i<=noOfPartners;i++) {
			document.getElementById("partner" + i).style.display="none";
		}
		document.getElementById("partnerControls").style.display="none";
		document.getElementById("directors").style.display="none";
		document.getElementById('registrationNumberLabel').style.display='none';
		document.getElementById('registrationNumberInput').style.display='none';
	}
	noOfPartners = 1;
}

function addPartner() {
	if(noOfPartners < 4) {
		toggleMe(document.getElementById("partner" + (noOfPartners + 1)), "display");
		noOfPartners++;
	} else {
		alert('Only a maximum of 4 partners can be added!');
	}
}

function removePartner() {
	if(noOfPartners > 1) {
		toggleMe(document.getElementById("partner" + noOfPartners), "display");
		noOfPartners--;
	} else {
		alert('You can\'t remove Partner 1. At least one Partner must be filled out if your company type is a partnership!');
	}
}

// Select option in selection dropdown based on a comparison value
function selectOption(element, value) {
	var target = document.getElementById(element);
	for(var i=0;i<target.length;i++){
		if(target[i].value.toUpperCase() == value.toUpperCase()) {
			target.selectedIndex = i;
        }
	}
}

// Limits textfield width and rows
String.prototype.reverse = function() {
    return this.split('').reverse().join('');
};

function limitText(limitField, limitNumChars, limitNumLines) {
	dents = limitField.value.replace(/[^\r\n]/g, '').replace(/(\r|\n)/g, '#').length;
	ents = limitField.value.replace(/[^\r\n]/g, '').replace(/(\r\n|\r|\n)/g, '#').length;
	if (limitField.value.length - dents + ents > limitNumChars) {
		limitField.value = limitField.value.substring(0, limitNumChars + dents - ents);
		alert("You can enter no more than " + limitNumChars + " characters in total!");
	} 

	ans = limitField.value.replace(/[^\r\n]/g, '').replace(/(\r\n|\r|\n)/g, '#').length + 1;
	if (ans > limitNumLines) {
		limitField.value = limitField.value.reverse().replace(/\n/, '').replace(/\r/, '').reverse();
		alert("You can enter no more than " + limitNumLines + " lines of text!");
	}
}