/* author: Don Kent, eShopHost Ltd 
	Copyright (C) 2005-10, eShopHost Ltd, all rights reserved.

	PURPOSE
1. Supports OrderAd with validation & submittal to ClassifiedAds.pl for adding to database
2. Supports BuyAd with validation & submittal to Dansie for adding to shopping cart. Includes check that BuyAd has an AdId (absent means an Admin added Ad?)
3. Supports Admin's ClassifiedAdsEdit.asp page - for managing the AdType, AdClass & Area
4. Supports ClassAdIndex.asp page - for managing filter by Area or Type

	INSTRUCTIONS
1. Include this Javascript file in the html head of pages: OrderAd, BuyAd, ClassifiedAdsEdit, ClassAdIndex
2. Requires standard eShopHost Javascript eshophj1.js

	CONTENTS of ClassifiedAds.js (functions for eShopHost Classified Advert Web feature
	Public functions
1. dosubmit (form) - Validates Classified Ad Order - true or false
2. buyAd (form) - Validate purchase for submittal to dansie
3. CheckAdId () - Checks on BuyAd page load that an AdId is present
4. initialiseClassifiedAdsEdit () - Admin's ClassifiedAdsEdit.asp page: sets drop-downs for AdvertType, ItemType & Area
5. changedAdTypeOrClass () - Admin's ClassifiedAdsEdit.asp page: sets hidden field Classification from AdvertType & ItemType selections
6. filterByArea () - directs to ClassAdIndex with:
	Area Drop-down present: same URL parameters but Area is as selected.
	Type Drop-down present: same URL parameters but Type added if not 0, else removed

	Internal functions
A. Create W3C DOM hidden input element & append
B. initClassAds () - Groups initialisation functions together

	Immediate Code
Initialisation

	Global Variables
None

	HISTORY
1.0 13/06/05 For EnduranceGB web launch
1.1 04/07/05 2. debug - moved 2.3 ahead of 2.1 as 'member' field is modified
1.2 04/07/05 2. add field 'return' dependent upon member or not.
1.3 25/07/05 1. add check for membership number if in members' area
1.4 24/08/05 1,2 add functions for stallion directory
1.5 27/09/05 Added changes made to CatItem.js for fuller compatibility: use getObj; for Problem Browser use W3CDOM approach; use window.onload to ensure fully loaded.
1.6 01/11/05 3./immediate code - Uses Inits array for multiple initialisations linked to event window.onload
1.7 14/12/05 3./immediate code - drop use of construct var objF = function xx(){..} as only worked with IE6. To reference the function, just use its name!
1.8 31/01/06 Generic version - NO LONGER COMPATIBLE with prototype EGB version
1.9 27/03/06 1. Fix: case sensitivity for photo extension
1.10 11/09/06 1. Added CONFIRM on click of Step 1 so people are advised & may cancel there.
1.11 12/01/09 return page for members changed to .aspx (used by egb)
1.12 12/05/10
	CN107a - 3. OrderAd page is now ASP
	BR109 - New 4, 5 & B - Need to use/set AdType & AdClass as well as Classification
1.13 12/05/10
	CN125 - 4 New Area capability
1.14 18/05/10
	CN126 - 6 New filter index by area
	BR114 - B. Enable OrderAd submit (as JS is enabled)
1.15 20/05/10
	CN127 - B. on index with filter by Area drop-down, add Area 0 "All Areas" if value 0 is missing
1.16 26/05/10
	CN129 - 6, B - Add Filter by Type functionality to ClassAdIndex
*/


	/* Public Functions */
function doSubmit (form) { // 1.
	// Validates Classified Ad Order - true or false
	
	// a. Validate Fields
	var ErrorMsg = "";
	// Summary (Title)
	if (form.Summary.value.length > 80) {
		ErrorMsg += "You have entered too many characters for the Title\n";
	}
	if (form.Summary.value.length < 1) {
		ErrorMsg += "You need to enter a Title\n";
	}
	// Advertiser's name
	if (form.Advertiser.value.length > 80) {
		ErrorMsg += "You have entered too many characters for the Name\n";
	}
	if (form.Advertiser.value.length < 1) {
		ErrorMsg += "You need to enter a Name\n";
	}
	// Telephone
	if (form.Telephone.value.length > 80) {
		ErrorMsg += "You have entered too many characters for the Phone\n";
	}
	if (form.Telephone.value.length == 0 && form.e_mail.value.length == 0) {
		ErrorMsg += "You need to enter either an email address or a telephone number, or both\n";
	}
	// Price
	if (form.Price.value.length > 80) {
		ErrorMsg += "You have entered too many characters for the Price\n";
	}
	if (form.Price.value.length < 1) {
		ErrorMsg += "You need to enter Price information\n";
	}
	// Email Address
	if ((form.e_mail.value.length > 0 && !Check ("e_mail", "email")) || form.e_mail.value.length > 80) {
		ErrorMsg += "Your email address appears to be invalid\n";
	}
	// Member number
	if (form.Member.value.length > 8 || (form.Member.value.length > 0 && !Check ("Member", "numeric"))) {
		ErrorMsg += "You have entered an incorrect membership number\n";
	}
	if ((document.URL.indexOf("members") != -1) && form.Member.value.length == 0) {
		ErrorMsg += "As a member, you must enter your membership number\n";
	}
	// Details word count
	var Details = form.Details.value;
	var Words = Details.split(/\s+/);
	if (Words.length > 300) {
		ErrorMsg += "You have entered too many words in the Details. Reduce the words by " +
			(Words.length - 300) + ".\n";
	}
	if (Words.length < 2) {
		ErrorMsg += "You need to enter some words in the Details.\n";
	}
	// Photo
	var Photo = form.Photo.value;
	var regExPhoto = /\.(jpg|jpeg|gif|png)$/i;
	if (Photo.length > 0) {
		if (Photo.search(regExPhoto) == -1) {
			ErrorMsg += "You have selected an incorrect file type for your photo\n";
		} else { // valid photo
			PhotoNote1 = "";
			PhotoNote2 = "";
			PhotoNote3 = "\nNOTE - your ad will fail if the photo is too large. Click CANCEL if you want to check if your photo is, preferably, smaller than 50 kbytes.";
		}
	} else { // no photo
		PhotoNote1 = "You have NOT selected a photo.\n";
		PhotoNote2 = " or add a photo";
		PhotoNote3 = "";
	}
	if (ErrorMsg.length > 0) {
		alert (ErrorMsg);
		return false;
	}
	
	// b. Special processing if administration action
	var param = location.search;
	if (param.indexOf("Action=") != -1) {
		form.Action.value = param.substr(param.indexOf("=")+1);
	}

	// c. Confirm user is ready
	return confirm ("Click OK if you are happy with your ad.\n" + PhotoNote1 + "Click CANCEL if you want to re-check you ad" + PhotoNote2 + ". You cannot change your ad later." + PhotoNote3);
}


function buyAd (form) { // 2.
	/*	Validate purchase for submittal to dansie - based on catitem.js
		Does any final checking of fields entered and then creates the variables needed by the shopping cart & submits */
	var HTMLHiddenInput = "";
	// 2.0a Check if problem browser (IE5 on Mac)
	var ProblemBrowser;
	var ua = navigator.userAgent;
	var IEoffset = ua.indexOf("MSIE");
	if ((IEoffset != -1) && (ua.indexOf("Mac") != -1)) { // IE on Mac
		var IEversion = parseFloat(ua.substring(IEoffset + 5, ua.indexOf(";", IEoffset)));
		if (IEversion >= 5 && IEversion < 6) { // and version 5
			ProblemBrowser = true;
		}
	}

	// 2.0b Prepare for output to Form
	var CartSubmit = getObj ("CartSubmit");
	if (!CartSubmit) {
		alert ("There is a problem with the web page. Element 'CartSubmit' does not exist. Please try again by refreshing the page. Do PLEASE let us know if the problem persists so we can fix it! See the 'Contact Us' page.");
		return;
	}

	// 2.1 Validate fields - Nothing required - no new inputs are made

	// 2.3 Price - use appropriate price string drawn from dB
	var PriceString;
	var Member = FieldValue ("Member");
	var Premium = FieldValue ("Premium");
	if (Premium == "Standard") { // Standard Advert
		if (Member.length == 0) { // Nonmember
			if (FieldValue ("Image").length > 0) { // With Photo
				PriceString =	FieldValue ("Pspn");
			} else { // No Photo (Just text)
				PriceString =	FieldValue ("Pstn");
			}
		} else { // A member
			if (FieldValue ("Image").length > 0) { // With Photo
				PriceString =	FieldValue ("Pspm");
			} else { // No Photo
				PriceString =	FieldValue ("Pstm");
			}
		}
	} else { // Premium Advert (More prominent display e.g. Always on top of list
		if (Member.length == 0) { // Nonmember
			if (FieldValue ("Image").length > 0) { // With Photo
				PriceString =	FieldValue ("Pppn");
			} else { // No Photo (Just text)
				PriceString =	FieldValue ("Pptn");
			}
		} else { // A member
			if (FieldValue ("Image").length > 0) { // With Photo
				PriceString =	FieldValue ("Pppm");
			} else { // No Photo
				PriceString =	FieldValue ("Pptm");
			}
		}
	}
	
	form.price.value = PriceString;
	
	// 2.2 Translate fields for Shopping Cart (Dansie)
	// 2.2.1 - OK fields - take no action
		// merchant (id of merchant on eshophost's mall Dansie)
		// price, name, quantity

	// 2.2.2 - 1 to 1 fields - none required

	// 2.2.3 - Compound/ Translated Fields
	var URL = document.URL;
	var F = URL.match(/^(http:\/\/[^\/]*)/i);
	var OrderAdPage = RegExp.$1;
	if (Member.length == 0) {
		Member = "NO";
		OrderAdPage += "/html/orderad.html";
	} else {
		OrderAdPage += "/membersonly/membersorderad.aspx";
	}
	HTMLHiddenInput += MakeHiddenInput ("return", OrderAdPage);
	HTMLHiddenInput += MakeHiddenInput ("custom1", "Member: " + Member);
	HTMLHiddenInput += MakeHiddenInput ("custom2", "Advert number: " + FieldValue ("AdId") );
	HTMLHiddenInput += MakeHiddenInput ("custom3", "Classification: " + FieldValue ("Classification") );
	if (ProblemBrowser) {
		W3CDOMfield("return", OrderAdPage);
		W3CDOMfield("custom1", "Member: " + Member);
		W3CDOMfield("custom2", "Advert number: " + FieldValue ("AdId"));
		W3CDOMfield("custom3", "Classification: " + FieldValue ("Classification"));
	}

	if (FieldValue ("Image").length > 0) {
		HTMLHiddenInput += MakeHiddenInput ("custom4", "Photo: YES");
		if (ProblemBrowser) {
			W3CDOMfield("custom4", "Photo: YES");
		}
	}

	// 2.4 Write Hidden Fields for Cart
	if (!ProblemBrowser) {
		CartSubmit.innerHTML = HTMLHiddenInput;
	}

	// 2.5 Submit to Shopping Cart
	return true; // Allow Submit to cgi-bin cart software
}


function CheckAdId () { // 3.
	/* Checks on BuyAd page load that an AdId is present. */
	if (location.href.search(/buyad\./i) == -1) {
		// Quit if not correct page
		return;
	}
	var objAdId = getObj ("AdId");
	var objPhoto = getObj ("Photo");
	if (objAdId && objPhoto) {
		if (objAdId.value == "") { // AdId Not set - so not reached by ClassifiedAds.pl script
			window.location.href = "OrderAd.asp"; // So send back to there
		} else { // AdId set OK
			// Set the Photo readonly field & display any image as appropriate & return
			var Image = FieldValue ("Image");
			if (Image.length > 0) {
				objPhoto.value = "Photo included: " + Image;
				var objPhotoArea = getObj ("PhotoArea");
				objPhotoArea.innerHTML = "<img src='../assets/images/ads/" + objAdId.value + Image.substr(Image.lastIndexOf(".")) + "'>";
			} else {
				objPhoto.value = "No Photo";
			}
			return;
		}
	} else {
		setTimeout ("CheckAdId()", 300);
	}
}


function initialiseClassifiedAdsEdit () { // 4.
	// Admin's ClassifiedAdsEdit.asp page: sets drop-downs for AdvertType, ItemType  & Area
	// 4.0 Get references
	var AdvertType = getObj ("AdvertType"); // e.g. Want
	var ItemType = getObj ("ItemType"); // e.g. Tack
	// 4.1 Abort if not applicable
	if (location.href.search(/ClassifiedAdsEdit\.asp/i) == -1) {
		// Quit if not correct page
		return;
	}
	if (!(AdvertType && ItemType)) { // drop-downs
		// Quit if not upgraded from single classification (text)
		return;
	}
	// 4.2 Set handler for changed value on AdvertType or ItemType drop-downs
	AdvertType.onchange = changedAdTypeOrClass;
	ItemType.onchange = changedAdTypeOrClass;
	// 4.3 From hidden AdvertTypeNum, set AdvertType combo
	var value;
	var optionValue;
	value = getObj ("AdvertTypeNum").value;
	for (var option = 0, length = AdvertType.options.length; option < length; option++) {
		optionValue = AdvertType.options[option].value;
		if (value == optionValue) {
			AdvertType.selectedIndex = option;
			break;
		}
	}
	// 4.4 From hidden ItemTypeNum, set ItemType combo
	value = getObj ("ItemTypeNum").value;
	for (var option = 0, length = ItemType.options.length; option < length; option++) {
		optionValue = ItemType.options[option].value;
		if (value == optionValue) {
			ItemType.selectedIndex = option;
			break;
		}
	}
	// 4.5 Set initial value of hidden Classification
	changedAdTypeOrClass ();
	// 4.6 New feature: Area
	var Area = getObj("Area"); // e.g. Wootton Bassett
	if (Area) { // drop-down
		// Upgraded with area feature
		// - From hidden AreaNum, set Area combo
		value = getObj ("AreaNum").value;
		for (var option = 0, length = Area.options.length; option < length; option++) {
			optionValue = Area.options[option].value;
			if (value == optionValue) {
				Area.selectedIndex = option;
				break;
			}
		}
	}
}


function changedAdTypeOrClass () { // 5.
	// Admin's ClassifiedAdsEdit.asp page: sets hidden field Classification from AdvertType & ItemType selections
	// - uses undisplayed combos AdvertTypes & ItemTypes as lookup tables: value = no., text = keyword
	// - displayed combos AdvertType & ItemType: values = no., text = display text
	// 5.1 Get references to hidden Classification, etc.
	var Classification = getObj ("Classification");
	var AdType = getObj ("AdvertType");
	var AdClass = getObj ("ItemType");
	var AdvertTypes = getObj ("AdvertTypes");
	var ItemTypes = getObj ("ItemTypes");
	var value;
	var optionValue;
	// 5.2 From value of drop-down AdType, get value for prefix of Classification from AdvertTypes combo (not displayed)
	value = AdType.options[AdType.selectedIndex].value;
	for (var option = 0, length = AdvertTypes.options.length; option < length; option++) {
		optionValue = AdvertTypes.options[option].value;
		if (value == optionValue) {
			value = AdvertTypes.options[option].text;
			break;
		}
	}
	Classification.value = value;
	// 5.3 From value of drop-down AdClass, get value for suffix of Classification from ItemTypes combo (not displayed)
	value = AdClass.options[AdClass.selectedIndex].value;
	for (var option = 0, length = ItemTypes.options.length; option < length; option++) {
		optionValue = ItemTypes.options[option].value;
		if (value == optionValue) {
			value = ItemTypes.options[option].text;
			break;
		}
	}
	Classification.value += value;
}


function filterByArea () { // 6.
	// directs to ClassAdIndex with same URL parameters:
	//	- Area Drop-down present: but Area is as selected.
	//	- Type Drop-down present: but Type added if not 0, else removed

	// 6.0 Get references
	var AreaFilter = getObj ("AreaFilter");
	var TypeFilter = getObj ("TypeFilter");
	var parameters = location.search;
	// 6.1 Area?
	if (AreaFilter) {
		// Read value & prepare parameters for redirect
		// Get Area value
		var Area = AreaFilter.selectedIndex;
		if (Area < 0) {
			// Not selected - use 'all areas'
			Area = 0;
		} else {
			Area = AreaFilter.options[Area].value;
		}
		// Strip any existing Area parameter
		parameters = parameters.replace (/&Area=\d*/i, "");
		// Add new Area parameter
		parameters += "&Area=" + Area;
	}
	// 6.2 Type?
	if (TypeFilter) {
		// Read value & prepare parameters for redirect
		// Get Type value
		var Type = TypeFilter.selectedIndex;
		if (Type < 0) {
			// Not selected - use 'all types'
			Type = 0;
		} else {
			Type = TypeFilter.options[Type].value;
		}
		// Strip any existing Type parameter
		parameters = parameters.replace (/&Type=\w*/i, "");
		// Add new Type parameter if not 'all types'
		parameters += ((Type == 0) ? "" :("&Type=" + Type));
	}
	// 6.3 Redirect to new Index page
	if (AreaFilter || TypeFilter) {
		location.search = parameters;
	}
}


function W3CDOMfield(name, value) { // A. Create W3C DOM hidden input element & append
	var objEl = document.createElement("input"); // > IE4 OK for <input>
	objEl.setAttribute("name",name); // IE4 OK
	objEl.setAttribute("value",value);
	CartSubmit.appendChild(objEl); // IE5 OK
}


function initClassAds () { // B. Groups initialisation functions together
	// 1. For BuyAd
	CheckAdId (); // 3.
	// 2. For AdminEdit
	initialiseClassifiedAdsEdit (); // 4.
	// 3. For ClassifiedAdsIndex
	var AreaFilterGo = getObj ("AreaFilterGo");
	if (AreaFilterGo) {
		// - set handler
		AreaFilterGo.onclick = filterByArea; // 6. for Area & Type
		// Area?
		var option;
		var parameters = location.search;
		var AreaFilter = getObj("AreaFilter");
		if (AreaFilter) {
			// - add in Area 0 if missing
			if (AreaFilter.options[0].value != 0) {
				option = document.createElement("option");
				option.value = 0;
				option.text = "All Areas";
				AreaFilter.add(option, 0);
			}
			// - set area selected to current area (if any)
			var Area = parameters.match(/&Area=(\d+)/i);
			if (Area) {
				Area = Area[1];
			} else {
				Area = 0;
			}
			for (var i = 0, l = AreaFilter.options.length; i < l; i++) {
				if (Area == AreaFilter.options[i].value) {
					AreaFilter.selectedIndex = i;
					break;
				}
			}
		}
		// Type?
		var TypeFilter = getObj ("TypeFilter");
		if (TypeFilter) {
			// - add in Type 0 if missing
			if (TypeFilter.options[0].value != 0) {
				option = document.createElement("option");
				option.value = 0;
				option.text = "All Types";
				TypeFilter.add(option, 0);
			}
			// - set Type selected to current area (if any)
			var Type = parameters.match(/&Type=(\w+)/i);
			if (Type) {
				Type = Type[1];
			} else {
				Type = 0;
			}
			for (var i = 0, l = TypeFilter.options.length; i < l; i++) {
				if (Type == TypeFilter.options[i].value) {
					TypeFilter.selectedIndex = i;
					break;
				}
			}
		}
	}
	// 4. For OrderAd
	var SubmitAd = getObj("SubmitAd");
	if (SubmitAd) {
		SubmitAd.style.visibility = "visible";
	}
}


/* Immediate Code */
if (typeof Inits == "object") { // Array Inits exists, so multiple initialisations needed
	Inits.push (initClassAds);
} else {
	window.onload = initClassAds;
}


