function modalPopupLinks() {
const links = document.querySelectorAll('a[data-popup]');
links.forEach((link) => {
const page = link.getAttribute('data-popup');
link.onclick=()=>{
const pop = document.querySelector('.modal-pop-container');
const content = document.querySelector('.modal-pop-content');
const throbber = '
';
content.innerHTML = throbber;
pop.classList.add('active');
fetch('/?page_type=modal-pop-content&page=' + page)
.then((response)=>response.text().then((html)=>{
content.innerHTML = html;
}));
return false;
}
});
const close = document.querySelectorAll('.modal-pop-close');
close.forEach((link) => {
const pop = link.parentNode.parentNode;
link.onclick=()=>{
pop.classList.remove('active');
return false;
}
});
}
/////////////////////////////////////////////////////////////////////////////////////
// DIY 'getElementsByClass' and do something function
//Create an array
var allPageTags = new Array();
allPageTags=document.getElementsByTagName("*");
function doSomethingWithClasses(theClass, theStyle, theValue) {
//Cycle through the tags using a for loop
for (i=0; i= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
var http = createRequestObject();
function updateDiv(div,scriptURL,queryVars,type,notifyBool) {
if (connectComplete == 1){
if (notifyBool == 1) {
document.getElementById(div).innerHTML = '
';
}
connectComplete = 0;
divName = div;
handleType = type;
http.open("GET", scriptURL + "?" + queryVars, true);
http.send(null);
http.onreadystatechange = handleHttpResponse;
}
}
//////////////////////////////////////////////////////////////////////////////////////
// Comments
function commentLike(cId) {
updateDiv('comments_comment_like_' + cId, '', 'page_type=comment_like&cid=' + cId,'html',0);
document.getElementById('comments_comment_like_' + cId).blur();
}
function commentReport(cId) {
updateDiv('comments_comment_report_' + cId, '', 'page_type=comment_report&cid=' + cId,'html',0);
document.getElementById('comments_comment_report_' + cId).blur();
document.getElementById('comments_comment_report_' + cId).onClick = 'return false;';
}
function commentQuote(cId) {
var commentMsg = document.getElementById('comments_comment_body_' + cId).innerHTML;
commentMsg = stripTags(commentMsg);
var commentBox = document.getElementById('comments_comment');
var newMsg = '[quote]' + commentMsg + '[/quote]\r\n';
commentBox.value = newMsg;
commentBox.focus();
}
/////////////////////////////////////////////////////////////////////////////////////
// Calendar
function calendarPop(triggerObj, inputBoxId, calType) {
var inputBox = document.getElementById(inputBoxId);
var triggerX = bumbleGetX(triggerObj);
var triggerY = bumbleGetY(triggerObj) + bumbleGetHeight(triggerObj);
var calendarObj = document.createElement('div');
var calendarId = 'calendar_pop_' + inputBoxId;
if (calType == 'monthyear')
calendarObj.className = 'calendar_pop_container calendar_pop_monthyear';
else
calendarObj.className = 'calendar_pop_container';
if (!document.getElementById(calendarId)) {
calendarObj.setAttribute('id', calendarId);
calendarObj.style.zIndex='9999999';
calendarObj.style.left=triggerX + 'px';
calendarObj.style.top=triggerY + 'px';
document.body.appendChild(calendarObj);
updateDiv(calendarId, '', 'page_type=calendar_modal&cal_type=' + calType + '&type=modal&input_box=' + inputBoxId, 'html', 0);
}
}
function calendarPopDestroy(objId) {
if (typeof(document.getElementById(objId)) != 'undefined') {
var obj = document.getElementById(objId);
obj.parentNode.removeChild(obj);
}
}
function calenderPopSelect(inputBoxId, day, month, year) {
var inputBox = document.getElementById(inputBoxId);
var calendarId = 'calendar_pop_' + inputBoxId;
var calendarObj = document.getElementById(calendarId);
inputBox.value = day + '/' + month + '/' + year;
inputBox.focus();
window.setTimeout('calendarPopDestroy(\'' + calendarId + '\')', 100);
}
function calendarPopUpdate(calId, action, calType) {
if (action == 'next')
var m = parseInt(document.getElementById('calendar_pop_month').value) + 1;
else if (action == 'prev')
var m = parseInt(document.getElementById('calendar_pop_month').value) - 1;
else m = document.getElementById('calendar_pop_month').value;
var y = document.getElementById('calendar_pop_year').value;
if (m > 12) {
m = 1;
y ++;
}
else if (m < 1) {
m = 12;
y --;
}
var inputBoxId = calId.replace('calendar_pop_', '');
var qs = '&m=' + m + '&y=' + y;
updateDiv(calId, '', 'page_type=calendar_modal&cal_type=' + calType + '&type=modal&input_box=' + inputBoxId + qs, 'html', 0);
}
function calendarPopSubmitMY(inputBoxId) {
var allMonths = new Array(' ', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var thisMonth = document.getElementById('calendar_pop_month').value;
var inputBox = document.getElementById(inputBoxId);
inputBox.value = allMonths[parseInt(thisMonth)] + ' ' + document.getElementById('calendar_pop_year').value;
calendarPopDestroy('calendar_pop_' + inputBoxId);
}
function calendar_show_time_slots(timestamp,type) {
location.href='#calendar_days';
updateDiv('calendar_times_container', '', 'page_type=calendar_times&action=book×tamp=' + timestamp + '&type=' + type, 'html', 1);
}
function update_calendar(action,type) {
if (action == 'next') m = parseInt(document.getElementById('calendar_list_months').value) + 1;
else if (action == 'prev') m = parseInt(document.getElementById('calendar_list_months').value) - 1;
else m = document.getElementById('calendar_list_months').value;
y = document.getElementById('calendar_list_years').value;
if (m > 12) {
m = 1;
y ++;
}
else if (m < 1) {
m = 12;
y --;
}
var qs = '&m=' + m + '&y=' + y;
updateDiv('calendar_container', '', 'page_type=calendar&action=book&' + 'type=' + type + qs, 'html', 1);
}
function calendar_book(timestamp,type) {
var chosen_date = new Date();
chosen_date.setTime(timestamp + '000');
chosen_hour = chosen_date.getHours();
if (chosen_hour > 12) chosen_hour -= 12;
else if (chosen_hour == 0) chosen_hour = 12;
if (chosen_hour > 11) chosen_suffix = 'AM';
else chosen_suffix = 'PM';
chosen_mins = chosen_date.getMinutes();
if (chosen_mins < 10) chosen_mins = '0' + chosen_mins;
var chosen_date_formatted = chosen_date.getDate() + '/' + (chosen_date.getMonth() + 1) + '/' + chosen_date.getFullYear() + ' at ' + chosen_hour + ":" + chosen_mins + ' ' + chosen_suffix;
if (confirm("You have requested a booking for " + chosen_date_formatted +".\n\nAre you sure you wish to proceed?\n\n ")) {
updateDiv('calendar_container', '', 'page_type=calendar&type=' + type + '&action=bookslot&slottime=' + timestamp, 'html', 1);
}
}
/////////////////////////////////////////////////////////////////////////////////////
// Product review submission
function shopRatingChange(rating, e) {
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
var imgStarOff = targ.src.replace('rate_star.gif', 'rate_star_off.gif');
var imgStarOn = targ.src.replace('rate_star_off.gif', 'rate_star.gif');
var idParts = targ.id.split('-');
var thisStar = '';
for (var r=1; r <= 5; r++) {
thisStar = document.getElementById(idParts[0] + '-' + idParts[1] + '-' + r);
if (r <= rating) thisStar.src = imgStarOn;
else thisStar.src = imgStarOff;
}
}
function submitRating(e) {
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
var idParts = targ.id.split('-');
var rating = idParts[2];
var pid = idParts[1];
window.location.href = '/?page=_product_review&pid=' + pid + '&action=new&rating=' + rating;
}
function submitReview(pid) {
if (document.getElementById('new_name') != null)
var name = parseQS(document.getElementById('new_name').value);
if (document.getElementById('new_location') != null)
var location = parseQS(document.getElementById('new_location').value);
var rating = parseQS(document.getElementById('new_rating').value);
var review = parseQS(document.getElementById('new_review').value);
updateDiv('review_form', '/', 'page_type=product_review&pid=' + pid + '&action=new&name=' + name + '&location=' + location + '&rating=' + rating + '&review=' + review, 'html', 1)
}
// swap product details with additional extra
function shopSwapProductDetails(mainPid, extraId) {
var shortDescription = document.getElementById('shop_product_short_description_' + mainPid);
var longDescription = document.getElementById('shop_product_long_description_' + mainPid);
var image = document.getElementById('shop_product_image_' + mainPid);
var price = document.getElementById('shop_product_price_' + mainPid);
var addItem = document.getElementById('shop_product_additem_' + mainPid);
shortDescription.innerHTML = shopProductExtras[extraId]['short_description'];
longDescription.innerHTML = shopProductExtras[extraId]['long_description'];
image.src = '/?page_type=show_image&w=' + image.width + '&h=' + image.height + '&img=' + shopProductExtras[extraId]['image'];
price.innerHTML = '£' + shopProductExtras[extraId]['price'];
addItem.value = extraId;
}
function getAddressFromPostcode(postCodeEl,returnInputsDelim) {
if (postCodeEl && typeof postCodeEl == 'object') {
window.clearTimeout(postCodeTimeout);
postCodeTimeout = window.setTimeout(function() {
if (postCodeEl.value == postCodeStr) return false;
else {
postCodeStr = postCodeEl.value;
if (typeof(postCodeCall) == 'object') {
postCodeCall.abort();
}
postCodeCall = new bumbleAJAXCall('/?page_type=address_from_postcode&postcode=' + postCodeStr,function(str) {
processAddressFromPostcode(str,returnInputsDelim);
}
);
}
}, 50);
}
}
function processAddressFromPostcode(str,returnInputsDelim) {
if (str != '') {
var addrArr = str.split('@@@@');
addressSelectFromPostcode(addrArr,returnInputsDelim);
}
}
function addressSelectFromPostcode(addressDelim,returnInputsDelim) {
// returnInputsDelim = element IDs for address fields, comma separated (address 1, address 2, town, county)
var returnInputsArr = returnInputsDelim.split(',');
var addressSelectObj = document.createElement("div");
var len = addressDelim.length;
for (var i = 0; i < len; i++) {
var thisAddr = addressDelim[i].split(', ');
var thisLink = document.createElement("a");
thisLink.href = '#';
thisLink.className = 'modal_select_link';
var thisAddressStr = thisAddr[0];
if (thisAddr[1] != '') thisAddressStr += ', ' + thisAddr[1];
if (thisAddr[5] != '') thisAddressStr += ', ' + thisAddr[5];
if (thisAddr[6] != '') thisAddressStr += ', ' + thisAddr[6];
thisLink.innerHTML = thisAddressStr;
thisLink.setAttribute('data-addr1', thisAddr[0]);
thisLink.setAttribute('data-addr2', thisAddr[1]);
thisLink.setAttribute('data-town', thisAddr[5]);
thisLink.setAttribute('data-county', thisAddr[6]);
thisLink.onclick = function() {
var addr1 = document.getElementById(returnInputsArr[0]);
var addr2 = document.getElementById(returnInputsArr[1]);
var town = document.getElementById(returnInputsArr[2]);
var county = document.getElementById(returnInputsArr[3]);
addr1.value = this.getAttribute('data-addr1');
addr2.value = this.getAttribute('data-addr2');
town.value = this.getAttribute('data-town');
county.value = this.getAttribute('data-county');
if (typeof postcodeBox == 'object') postcodeBox.hide();
return false;
};
addressSelectObj.appendChild(thisLink);
}
var postcodeBox = new bumbleBox('', 'Please select your address', '90%', 'auto', 'object', '', true, '', addressSelectObj);
postcodeBox.show();
}
var postCodeCall = '';
var postCodeTimeout = '';
var postCodeStr = '';
var postcodeBox = '';
/////////////////////////////////////////////////////////////////////////////////////
// Validate forms
function checkform(formname) {
/* Tool methods */
function cf_adderr(o) {
// create image, add to and colourise the error fields
var errorIndicator=document.createElement('img');
errorIndicator.alt=errorAlt;
errorIndicator.src=errorImg;
errorIndicator.title=errorTitle;
o.className=errorClass;
o.parentNode.insertBefore(errorIndicator,o);
// Check if there is no error message
if(!document.getElementById(errorID)) {
// create errormessage and insert before submit button
var em = document.createElement('div');
em.style.textAlign='left';
em.id = errorID;
var newp = document.createElement('p');
newp.innerHTML = errorMsg;
// clone and insert the error image
newp.appendChild(errorIndicator.cloneNode(true));
em.appendChild(newp);
// find the submit button
for(var i=0; i < formname.getElementsByTagName('input').length; i++){
if(/submit/i.test(formname.getElementsByTagName('input')[i].type)) {
var sb = formname.getElementsByTagName('input')[i];
break;
}
}
if(sb) {
sb.parentNode.insertBefore(em,sb);
}
}
}
function cf_isEmailAddr(str) {
return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
}
if(!document.getElementById || !document.createTextNode || !formname.required) {
return;
}
else {
var errorID='error_alert';
var errorClass='input_error'
var errorMsg='Some fields are missing or invalid.
Please enter or change the fields marked with a ';
var errorImg='library/templates/default/resources/form_alert.gif';
var errorAlt='Error';
var errorTitle='Please complete this field';
var reqfields=formname.required.value.split('||');
// Cleanup old mess
// if there is an old errormessage field, delete it
if(document.getElementById(errorID)){
var em=document.getElementById(errorID);
em.parentNode.removeChild(em);
}
// remove old images and classes from the required fields
for(var i=0; i < reqfields.length; i++) {
var f=document.getElementById(reqfields[i]);
if(!f) continue;
if(f.previousSibling && /img/i.test(f.previousSibling.nodeName)) {
f.parentNode.removeChild(f.previousSibling);
}
f.className='inputbox';
}
// loop over required fields
for(var i=0; i < reqfields.length; i++) {
// check if required field is there
var f=document.getElementById(reqfields[i]);
if(!f) continue;
// test if the required field has an error,
// according to its type
else switch(f.type.toLowerCase()) {
case 'text':
if(f.value=='' && f.id!='email' && (f.attributes.alt.value) != 'Email') cf_adderr(f);
if((f.id=='email' || ((f.attributes.alt.value) == 'Email')) && !cf_isEmailAddr(f.value)) cf_adderr(f);
break;
case 'hidden': // if hidden, then we're looking for a radio selection instead, using name instead of ID
var formnameName = formname.name;
var radioObject = eval('document.' + formnameName + '.' + f.id + ';');
var radioObjectNum = (radioObject.length == 'undefined') ? 1 : radioObject.length;
var radioChecked = 0;
for(var r = 0; r < radioObjectNum; r++) {
if(radioObject[r].checked) {
radioChecked = 1;
break;
}
}
if (radioChecked == 0) cf_adderr(f);
break;
case 'textarea':
if(f.value=='') cf_adderr(f);
break;
case 'checkbox':
if(!f.checked) cf_adderr(f);
break;
case 'select-one':
if(!f.selectedIndex && f.selectedIndex==0) cf_adderr(f);
break;
}
}
return !document.getElementById(errorID);
}
}
function validateField(field, valType, compareField) {
var fieldId = field.id;
if (typeof valInProgress != 'undefined' && typeof valInProgress[fieldId] != 'undefined')
window.clearTimeout(valInProgress[fieldId]);
else if (typeof valInProgress == 'undefined')
valInProgress = new Array();
validationMessage(fieldId, 'wait');
valInProgress[fieldId] = window.setTimeout("actualValidate('" + fieldId + "', '" + valType + "', '" + compareField + "')", 500);
}
function actualValidate(fieldId, valType, compareField) {
var field = document.getElementById(fieldId);
var fieldValue = field.value;
var validated = false;
if (document.getElementById(compareField)) var compareVal = document.getElementById(compareField).value;
switch (valType) {
case "password":
if (fieldValue.length < 6)
var valMsg = 'Password must be 6 or more characters long';
else validated = true;
break;
case "confirm":
if (fieldValue.length < 6)
var valMsg = 'Password must be 6 or more characters long';
else if (fieldValue != compareVal)
var valMsg = 'This must be the same as the password';
else validated = true;
break;
case "email":
if (!fieldValue.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/))
var valMsg = 'This doesn\'t appear to be a proper email address';
else validated = true;
break;
case "postcode":
field.value = formatPostcode(fieldValue);
fieldValue = field.value;
if(!isValidPostcode(fieldValue))
var valMsg = 'This doesn\'t appear to be a valid postcode';
else validated = true;
break;
case "none":
validated = true;
break;
default: // check if empty or not
if (fieldValue != '') validated = true;
else var valMsg = 'This field cannot be empty.';
break;
}
validationMessage(fieldId, validated, valMsg);
}
function validationMessage(fieldId, validated, valMsg) {
var field = document.getElementById(fieldId);
var valIcon = document.getElementById('valid_icon_' + fieldId);
var iconOK = '/library/templates/default/resources/validate_ok.gif';
var iconFailed = '/library/templates/default/resources/validate_failed.gif';
var iconWait = '/library/templates/default/resources/validate_wait.gif';
if (valIcon == null) {
var posX = findPosX(field) + field.offsetWidth + 25;
var posY = findPosY(field) + field.offsetHeight - 21;
var newValIcon = document.createElement('div');
var bodyElement = document.getElementsByTagName('body');
newValIcon.setAttribute('id', 'valid_icon_' + fieldId);
field.parentNode.appendChild(newValIcon);
//bodyElement[0].firstChild.parentNode.insertBefore(newValIcon, bodyElement[0].firstChild);
valIcon = document.getElementById('valid_icon_' + fieldId);
valIcon.style.display = 'inline';
valIcon.style.position = 'absolute';
valIcon.style.marginTop = '-2px';
valIcon.style.marginLeft = '10px';
//valIcon.style.top = posY + 'px';
//valIcon.style.left = posX + 'px';
valIcon.style.padding = '2px 2px 2px 30px';
valIcon.style.height = '19px';
valIcon.style.backgroundPosition = '2px 2px';
valIcon.style.backgroundRepeat = 'no-repeat';
}
if (validated == 'wait') {
valIcon.style.backgroundColor = 'Transparent';
valIcon.style.backgroundImage = 'url(' + iconWait + ')';
valIcon.innerHTML = ' ';
}
else if (validated == true) {
valIcon.style.backgroundColor = 'Transparent';
valIcon.style.backgroundImage = 'url(' + iconOK + ')';
valIcon.innerHTML = ' ';
}
else {
valIcon.style.backgroundColor = '#fff';
valIcon.style.backgroundImage = 'url(' + iconFailed + ')';
valIcon.innerHTML = valMsg;
}
}
function isValidPostcode(p) {
var postcodeRegEx = /[A-Z]{1,2}[0-9]{1,2}[A-Z]? ?[0-9][A-Z]{2}/i;
return postcodeRegEx.test(p);
}
function modalMessagesScrollDown() {
var messageBox = document.getElementById('modal_messages_messages');
var scrollEl = document.getElementById('modal_messages_bottom');
messageBox.scrollTop = scrollEl.offsetTop;
var messageInput = document.getElementById('modal_message_new');
messageInput.value = '';
messageInput.focus();
}
var thisBumbleBox;
function modalMessagesSubmitMsg() {
var messageContent = document.getElementById('modal_message_new').value;
messageContent = parseQS(messageContent);
var messageWindow = document.getElementById('modal_messages_messages');
var bottomAnchor = document.getElementById('modal_messages_bottom');
var newBubble = document.createElement("div");
newBubble.className = 'modal_messages_message you';
newBubble.style.opacity='0.5';
var throbber = document.createElement("div");
throbber.className = 'bumbleThrobber top dark';
newBubble.appendChild(throbber);
messageWindow.insertBefore(newBubble, bottomAnchor);
window.setTimeout('modalMessagesScrollDown()', 100);
var userId = document.getElementById('modal_messages_uid').value;
window.setTimeout(function() {
var updateContent = new bumbleAJAXCall('/?page_type=users_messages_modal&action=new&user_id=' + userId + '&message=' + messageContent, function() { window.setTimeout(modalMessagesScrollDown, 100); }, messageWindow);
}, 1000);
}
function modalMessagesView(userId) {
if (!userId || userId == 'undefined') userId = '';
thisBumbleBox = new bumbleBox('/?page_type=users_messages_modal&user_id=' + userId, 'Messages', '90%', '90%', 'ajax', modalMessagesScrollDown, false);
thisBumbleBox.show();
}
function recalcFormProductTotal() {
window.setTimeout('recalcFormProductTotalAction()', 100);
}
function recalcFormProductTotalAction() {
var fields = document.getElementById('check_products_delim');
var thisEl = '';
var thisId = '';
var valueField = '';
var thisValue = '';
var thisValueParts = '';
var thisSelectObj = '';
var totalValue = 0;
if (fields != null && fields.value != '') {
var fieldsArr = fields.value.split(',');
for (var i = 0; i < fieldsArr.length; i++) {
valueField = null;
if (fieldsArr[i] != '') {
thisEl = document.getElementById(fieldsArr[i]);
if (thisEl != null) {
if (thisEl.tagName == 'INPUT' || thisEl.tagName == 'input') {
if (thisEl.type == 'checkbox' && thisEl.checked == true) {
// item has been ticked - add price
thisId = fieldsArr[i].replace(/\_form\_/, '', fieldsArr[i]); ;
valueField = document.getElementById('product_value_' + thisId);
}
else if (thisEl.type == 'hidden') {
// item has extras - parent item's price will be added too
// check an option has been selected from extras before adding this price
thisId = fieldsArr[i].replace(/\product\_value\_/, '', fieldsArr[i]);
thisSelectObj = document.getElementById('extra_item_' + thisId);
if (thisSelectObj != null && thisSelectObj.selectedIndex > 0) {
valueField = document.getElementById(fieldsArr[i]);
}
}
if (valueField != null) totalValue += parseInt(valueField.value);
}
else if (thisEl.tagName == 'SELECT' || thisEl.tagName == 'select') {
thisValue = thisEl.value;
if (thisValue != '') {
thisValueParts = thisValue.split(',');
if (thisValueParts[1] != null) totalValue += parseInt(thisValueParts[1]);
}
}
}
}
}
document.getElementById('form_products_total_value').innerHTML = totalValue;
}
}
/* formats a VALID postcode nicely: AB120XY -> AB1 0XY */
function formatPostcode(p) {
if (isValidPostcode(p)) {
var postcodeRegEx = /(^[A-Z]{1,2}[0-9]{1,2}[A-Z]?)([0-9][A-Z]{2}$)/i;
p = p.toUpperCase();
return p.replace(postcodeRegEx,"$1 $2");
} else {
return p;
}
}
function findPosX(obj) {
var curleft = 0;
if(obj.offsetParent)
while(1)
{
curleft += obj.offsetLeft;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.x)
curleft += obj.x;
return curleft;
}
function findPosY(obj) {
var curtop = 0;
if(obj.offsetParent)
while(1)
{
curtop += obj.offsetTop;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.y)
curtop += obj.y;
return curtop;
}
function addToWishlist() {
document.getElementById('shop_wishlist_toggle').value='1';
document.getElementById('shop_product_form').submit();
return false;
}
// For shop - when using additional products, check if any are ticked
function checkTickedProducts(thisFormId) {
thisForm = document.getElementById(thisFormId);
numExtra = thisForm.num_extra.value;
if(thisForm.xtra_val_1) {
noneTicked=1;
for (x=1; x<=numExtra; x++) {
thisElement=eval("thisForm.xtra_bool_"+x);
if(thisElement.checked) {
noneTicked=0;
}
}
if (noneTicked==1) {
alert('Please tick the items you require before adding to cart');
return false;
}
}
else {
return true;
}
}
// Cart accessories
function shopCartShowAccessories(catId) {
var accContainer = document.getElementById('shop_cart_accessories_products');
var accArr = eval('accessories_' + catId);
accContainer.innerHTML = '';
for (var i=0; i < accArr.length; i++) {
var lineHTML = '';
lineHTML += '
';
lineHTML += '
Add to basket';
lineHTML += '
£' + accArr[i]['price'] + ' ' + accArr[i]['unit'] + '';
lineHTML += '
' + accArr[i]['short_description'] + '
';
lineHTML += '
' + accArr[i]['long_description'] + '
';
lineHTML += '
';
accContainer.innerHTML += lineHTML;
}
accContainer.style.display = 'block';
window.location.hash = "accessories";
}
// tidy strings before passing via query string
function parseQS(str) {
str = str.replace(/\%/g, '[percent]');
str = encodeURIComponent(str);
str = str.replace(/\%5Bpercent\%5D/g, '%25');
return str;
}
// get all input names within element
function getAllInputs(el) {
var oChild = el.firstChild;
var inputsArr = [];
if (oChild) {
while(oChild) {
var oChildChild = oChild.firstChild;
if (oChildChild) {
var elsArr = getAllInputs(oChild);
if (elsArr.length > 0)
inputsArr = inputsArr.concat(elsArr);
}
if (oChild.name && typeof oChild.name != 'undefined') {
inputsArr.push(String(oChild.name));
}
oChild = oChild.nextSibling;
}
}
return inputsArr.unique();
}
// Strip HTML tags
function stripTags(strMod){
if (arguments.length<3) strMod=strMod.replace(/<\/?(?!\!)[^>]*>/gi, '');
else{
var IsAllowed=arguments[1];
var Specified=eval("["+arguments[2]+"]");
if(IsAllowed){
var strRegExp='?(?!(' + Specified.join('|') + '))\b[^>]*>';
strMod=strMod.replace(new RegExp(strRegExp, 'gi'), '');
}else{
var strRegExp='?(' + Specified.join('|') + ')\b[^>]*>';
strMod=strMod.replace(new RegExp(strRegExp, 'gi'), '');
}
}
return strMod;
}
// Confirmations
function confirmAction(msg) {
if (!msg) var msg = 'Are you sure you wish to delete this item?';
return confirm(msg);
}
// Popup windows
var newwin;
function launchwin(winurl,winname,winfeatures) {
if(newwin) { newwin.close(); }
newwin = window.open(winurl,winname,winfeatures);
newwin.focus();
}
function placeFocus() {
if (document.forms.length > 0) {
var field = document.forms[0];
for (i = 0; i < field.length; i++) {
if ((field.elements[i].type == "text") || (field.elements[i].type == "textarea") || (field.elements[i].type.toString().charAt(0) == "s")) {
document.forms[0].elements[i].focus();
break;
}
}
}
}
function showModalInfo(e, itemType, itemId) {
var modalBox = document.getElementById('modal_info_container');
if (!e) var e = window.event;
var currentPosX = e.pageX - 50;
var currentPosY = e.pageY - 100;
modalBox.style.left = currentPosX + 'px';
modalBox.style.top = currentPosY + 'px';
modalBox.style.display = 'block';
updateDiv('modal_info_content', '/', 'page_type=modal_content&type=' + itemType + '&id=' + itemId, 'html', 1);
}
function hideModalInfo() {
var modalBox = document.getElementById('modal_info_container');
var modalContent = document.getElementById('modal_info_content');
modalContent.innerHTML = '';
modalBox.style.display = 'none';
}
// Return characters pressed, in input boxes etc, and filter (e.g. numbers only)
function getkey(e) {
if (window.event)
return window.event.keyCode;
else if (e)
return e.which;
else
return null;
}
function swapimage(imageid, imagefile) {
document.getElementById(imageid).src = 'library/images/' + imagefile;
}
function goodchars(e, goods) {
var key, keychar;
key = getkey(e);
if (key == null) return true;
// get character
keychar = String.fromCharCode(key);
keychar = keychar.toLowerCase();
goods = goods.toLowerCase();
// check goodkeys
if (goods.indexOf(keychar) != -1)
return true;
// control keys
if ( key==null || key==0 || key==8 || key==9 || key==13 || key==27 )
return true;
// else return false
return false;
}
function changeqty(dir, id) {
currentqty = parseInt(document.getElementById(id).value);
if (dir=='up') document.getElementById(id).value = currentqty+1;
else if (dir=='down' && currentqty > 1)
document.getElementById(id).value = currentqty-1;
else if (dir=='down' && currentqty < 2)
document.getElementById(id).value = 1;
}
function checksearch(searchform,searchbox)
{
if (document.forms[searchform].elements[searchbox].value == "") {
alert( "Please enter your criteria in the search box." );
document.forms[searchform].elements[searchbox].focus();
return false;
}
else if (document.forms[searchform].elements[searchbox].value.length < 3) {
alert( "Search term should be more than 2 characters" );
document.forms[searchform].elements[searchbox].focus();
return false;
}
else return true;
}
function showFormComment(fieldId) {
document.getElementById('form_comment_' + fieldId).style.display = 'block';
}
function checkAndShowCommentBox(fieldId, formName) {
var specialConcat = document.getElementById('_special_' + fieldId).value;
var specialIndexes = specialConcat.split(',');
var formField = document.getElementById('_form_' + fieldId);
if (formField.type == 'hidden') { // if hidden, then we're looking for a radio selection instead, using name instead of ID
var radioObject = eval('document.' + formName + '.' + '_form_' + fieldId + ';');
var radioObjectNum = (radioObject.length == 'undefined') ? 1 : radioObject.length;
var radioChecked = 0;
for(var r = 0; r < radioObjectNum; r++) {
if(radioObject[r].checked) {
var fieldSelected = r - 1;
break;
}
}
}
else {
var fieldSelected = formField.selectedIndex - 1;
}
var key = '';
for (key in specialIndexes) {
if (specialIndexes[key] == fieldSelected) {
showFormComment(fieldId);
var comments = 1;
}
}
if (comments != 1) {
document.getElementById('form_comment_' + fieldId).style.display = 'none';
}
}
function formsDisabledWarning(inputObj) {
alert('Please view the attachment before answering this question.');
inputObj.blur();
}
function formsEnableField(fieldId) {
fieldObj = document.getElementById('_form_' + fieldId);
fieldObj.onfocus = '';
}
function commentsEditComment(commentId) {
var commentDiv = document.getElementById('comments_comment_body_' + commentId);
var parentDiv = commentDiv.parentNode;
var commentText = commentDiv.innerHTML;
commentText = commentText.replace(/
/gi, '');
commentText = commentText.replace(/
/gi, '');
var boxWidth = parentDiv.offsetWidth - 100;
var thisURL = window.location.pathname + '#comments' + commentId;
var newHTML = '';
commentDiv.innerHTML = newHTML;
}
function show_ee() {
//
}
function shopSlideShow(imagesDelim, width, height,offSet) {
width = window.innerWidth || document.documentElement.clientWidth;
height = window.innerHeight || document.documentElement.clientHeight;
width = width - 100;
height = height - 100;
width = width > 900 ? 900 : width;
height = height > 700 ? 700 : height;
var imagesArr = imagesDelim.split(',');
var firstImg = '/?page_type=show_image&img=' + imagesArr[0] + '&w=' + width + '&h=' + height + '&canvas=frame&bgcolour=ffffff&q=90';
var callBack = 'shopSlideShowGenerate(\'' + addslashes(imagesDelim) + '\', ' + width + ', ' + height + ', \'' + offSet + '\')';
manualiBox(firstImg, 'type=1&width=' + (width) + '&height=' + (height), callBack);
shopSlideShowGenerate(addslashes(imagesDelim), width, height, offSet);
}
function shopSlideShowGenerate(imagesDelim, width, height, offSet) {
var contentDiv = document.getElementById('ibox_content');
var imagesArr = imagesDelim.split(',');
var len = imagesArr.length;
var randNum = Math.floor((Math.random()*100000)+1);
var thisContainer = 'gallery_slider_' + randNum;
var htmlStr = '';
for(var i=0; i < len; i++) {
htmlStr += '
';
}
htmlStr += '
';
contentDiv.innerHTML = htmlStr;
var thisSlider = new bumbleSlider(thisContainer, width, height, 2000, 2000, offSet, 1, 'slide', 1);
}
function embedCourseExam(examModrw, divId) {
updateDiv(divId,'','page_type=course_exam&exam_modrw=' + examModrw,'html',1);
}
function proceedCourseAnswer(obj, attemptId, examModrw, questionKey, answerKey, validateBool) {
var parentId = obj.parentNode.id;
var validateQS = validateBool == 1 ? '&validate=1&answer_key=' + answerKey + '&question_key=' + questionKey: '';
updateDiv(parentId,'','page_type=course_exam&attempt_id=' + attemptId + '&exam_modrw=' + examModrw + validateQS,'html',0);
}
function addslashes(str) {
str=str.replace(/\\/g,'\\\\');
str=str.replace(/\'/g,'\\\'');
str=str.replace(/\"/g,'\\"');
str=str.replace(/\0/g,'\\0');
return str;
}
function stripslashes(str) {
str=str.replace(/\\'/g,'\'');
str=str.replace(/\\"/g,'"');
str=str.replace(/\\0/g,'\0');
str=str.replace(/\\\\/g,'\\');
return str;
}
function findPosX(obj)
{
var curleft = 0;
if(obj.offsetParent)
while(1)
{
curleft += obj.offsetLeft;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.x)
curleft += obj.x;
return curleft;
}
function findPosY(obj)
{
var curtop = 0;
if(obj.offsetParent)
while(1)
{
curtop += obj.offsetTop;
if(!obj.offsetParent)
break;
obj = obj.offsetParent;
}
else if(obj.y)
curtop += obj.y;
return curtop;
}
function getStats() {
var screenres;
var screencolor;
var flashvn;
var browser;
var browservn;
var os;
if (screen.width) screenres=screen.width+" x "+screen.height;
else screenres="Unknown";
if (screen.colorDepth) screencolor=screen.colorDepth;
else screencolor="Unknown";
browser='';
browservn='';
alert("Screen res: "+screenres+", "+screencolor+" bit\nBrowser: "+browser+" "+browservn);
}
function listCategoryTree(type, containerId, parentId, divPrefix) {
if (!divPrefix) var divPrefix = containerId;
updateDiv(containerId,'','page_type=output_categories&parent_id=' + parentId + '&type=' + type + '&container_id=' + containerId + '&div_prefix=' + divPrefix,'html',0,'');
}
function swapGalImg(parentDiv, imgFile) {
var containerDiv = document.getElementById(parentDiv);
if (containerDiv != null) {
// get width and height
var largeWidth = containerDiv.clientWidth;
var largeHeight = containerDiv.clientHeight;
var largeImgFile = '/?page_type=show_image&img=' + imgFile + '&w=' + largeWidth + '&h=' + largeHeight + '&canvas=crop';
var fullImgFile = '/library/images/' + imgFile;
// make sure container is positioned relatively
containerDiv.style.position = 'relative';
containerDiv.style.overflow = 'hidden';
// loop elements to find image
var oChild = containerDiv.firstChild;
if (oChild) {
while(oChild) {
if ((oChild.tagName == 'img' || oChild.tagName == 'IMG') && oldImg == null) {
var oldImg = oChild;
}
else {
oChild.parentNode.removeChild(oChild);
}
oChild = oChild.nextSibling;
}
}
// if old image exists
if (oldImg != null) {
// position top left
oldImg.style.position = 'absolute';
oldImg.style.top = 0;
oldImg.style.left = 0;
oldImg.style.zIndex = 10;
}
// create new element and position top left, zindex 0
var newImg = document.createElement("img");
newImg.src = largeImgFile;
newImg.style.position = 'relative';
newImg.style.zIndex = 0;
newImg.style.top = 0;
newImg.style.left = 0;
newImg.style.cursor = 'pointer';
newImg.onclick = function() { manualiBox(fullImgFile) }
containerDiv.appendChild(newImg);
// fade out old one, callback destroy
if (oldImg != null) {
var fadeOut = new bumbleTransitionObj(oldImg, 'opacity', 100, 0, '', 500, 'cos', '', 'if (this.obj.parentNode != null) this.obj.parentNode.removeChild(this.obj)', 100);
}
// new img onclick = ibox
}
}