document.getElementsByAttribute = function(strTagName, strAttributeName, strAttributeValue)
{
	var oElm=this;
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
	var oCurrent;
	var oAttribute;
	for(var i=0; i<arrElements.length; i++)
	{
		oCurrent = arrElements[i];
		oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
		if(typeof oAttribute == "string" && oAttribute.length > 0)
		{
			if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute)))
			{
				arrReturnElements.push(oCurrent);
			}
		}
	}
	return arrReturnElements;
}

String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function searchGoogle(keywordElementId)
{
	site = "kotarayaonline.com";

	elementKeyword = document.getElementById(keywordElementId);
	if(elementKeyword)
	{
		url = "http://www.google.com/search?sitesearch=" + site + "&as_q=" + elementKeyword.value + "&x=0&y=0&hl=id";
		this.location = url;
	}
	else
	{
		alert("Search Element not Found!");
	}
}

function validateForm(formId)
{
	form = document.getElementById(formId);

	if(form)
	{
		for(elementIndex=0; elementIndex<form.length; elementIndex++)
		{
			validate(form.elements[elementIndex]);
		}
	}
}

function validate(element)
{
	error = "";

	isRequired = parseInt(element.getAttribute("isRequired"));
	if(isRequired != "0" && isRequired != "1")
	{
		isRequired = "1";
	}

	mask = element.getAttribute("mask");
	if(!mask)
	{
		mask = "";
	}

	isValid = true;

	if(isRequired == 1)
	{
		if(element.value.length==0)
		{
			isValid = false;
		}
	}

	if(mask == "name")
	{
		var illegalChars = /[^\w\s]/;
		// All but ( "a-zA-Z0-9_" and " " )

		if(illegalChars.test(element.value))
		{
			isValid = false;
		}

		var stripped = element.value.replace(/[\s]/g, '');
		if(stripped.length==0 && isRequired=="1")
		{
			isValid = false;
		}
	}

	if(mask == "phone")
	{
		var stripped = element.value.replace(/[\(\)\.\-\ \+]/g, '');
		//strip out acceptable non-numeric characters

		var illegalChars = /[\D]/;
		// All but ( "0-9" )

		if(illegalChars.test(stripped))
		{
			error = "The phone number contains illegal characters.";
			isValid = false;
		}

		if(stripped.length==0 && isRequired=="1")
		{
			isValid = false;
		}
	}

	if(mask == "email")
	{
		var emailFilter=/^.+@.+\..{2,3}$/;
		if(!(emailFilter.test(element.value)))
		{
			isValid = false;
		}

		var illegalChars= /[\(\)\<\>\,\;\:\\\/\"\[\]]/;
		if(element.value.match(illegalChars))
		{
			error = "The email address contains illegal characters.\n";
			isValid = false;
		}
	}

	if(mask == "text")
	{

	}

	if(mask == "checkbox")
	{
		name = element.getAttribute("name");
		if(!name)
		{
			name = "";
		}

		elements = document.getElementsByName(name);
		checked = 0;

		for(elementsIndex = 0; elementsIndex<elements.length; elementsIndex++)
		{
			if(elements[elementsIndex].checked == true)
			{
				checked ++;
			}
		}

		if(checked == 0)
		{
			isValid = false;
		}
	}

	bgImage = "";
	if(isValid)
	{
		bgImage = "url(images/icon-valid.gif)";
	}
	else
	{
		bgImage = "url(images/icon-invalid.gif)";
	}

	inputTarget = element.parentNode;

	if(mask != "continue")
	{
		inputTarget.style.backgroundImage = bgImage;
	}
}

function clearChildElement(parentElement)
{
	if(parentElement)
	{
		while(parentElement.hasChildNodes())
		{
			parentElement.removeChild(parentElement.lastChild);
		}
	}
}

cartLabelElementId = "cartLabel";
function addToCartAjax(productId, priceItemIndex, cartLabelElementId)
{
	advAJAX.get({
		url: "shop-management-ajax.jsp",
		parameters : {
			"action" : "shoppingcart-add-ajax",
			"productId" : productId,
			"priceItemIndex" : priceItemIndex
		},
		onSuccess : function(obj)
		{
			// report format: [isSuccess:1|0],[Product in ShoppingCart:int],[Message:String]
			totalResponse = 3;
			responseSuccess = "0";
			responseProductQuantity = "0";
			responseMessage = "";

			responseList = obj.responseText.split(",", totalResponse);

			if(responseList.length>1)
			{
				responseSuccess = responseList[0];
			}
			if(responseList.length>2)
			{
				responseProductQuantity = responseList[1];
			}
			if(responseList.length>3)
			{
				responseMessage = responseList[2];
			}

			updateElement = document.getElementById(cartLabelElementId);
			if(updateElement)
			{
				clearChildElement(updateElement);
				updateElement.appendChild(document.createTextNode(responseProductQuantity));
				alert("You have successfully added Product to Shopping Cart.\nYour cart now contains " + responseProductQuantity + " product(s).");
				location = "#"+cartLabelElementId;
			}
			else
			{
				alert("no update area!");
			}
		},
		onError : function(obj) { alert("Error: " + obj.status); }
	});
}

elementBasePrefix = "shopOrder";
elementLengthPrefix = elementBasePrefix + "-length";
elementItemPrefix = elementBasePrefix + "-";
elementDeletePrefix = elementBasePrefix + "-delete-";
elementUnitPrefix = elementBasePrefix + "-unit-";
elementUnitIndexPrefix = elementBasePrefix + "-unitIndex-";
elementUnitListPrefix = elementBasePrefix + "-unitList";
elementQtyPrefix = elementBasePrefix + "-qty-";
elementPricePrefix = elementBasePrefix + "-price-";
elementSubtotalPrefix = elementBasePrefix + "-subtotal-";
elementTotalPrefix = elementBasePrefix + "-total";

function getArrayIndex(value, list)
{
	if(list==null)
	{
		return -1;
	}

	for(index=0; index<list.length; index++)
	{
		if(list[index]==value)
		{
			return index;
		}
	}
	return -1;
}

function calculate()
{
	elementLength = document.getElementById(elementLengthPrefix);
	elementUnitList = document.getElementById(elementUnitListPrefix);

	if(!elementLength || !elementUnitList)
	{
		alert("Required element(s) not ready");
		return;
	}

	unitList = elementUnitList.value.trim().split(",");
	totalList = new Array();
	for(i=0; i<unitList.length; i++)
	{
		totalList[i] = 0;
	}

	var length = elementLength.value;
	for(i=0; i<length; i++)
	{
		elementDelete = document.getElementById(elementDeletePrefix+i);
		if(elementDelete)
		{
			if(elementDelete.value==1 || elementDelete.value=='1')
			{
				continue;
			}

			price = 0;
			elementPrice = document.getElementById(elementPricePrefix+i);
			if(elementPrice)
			{
				price = elementPrice.value;							
			}
			else
			{
				alert("element price not found");
			}

			unit = "";
			elementUnit = document.getElementById(elementUnitPrefix+i);
			if(elementUnit)
			{
				unit = elementUnit.value;							
			}
			else
			{
				alert("element unit not found");
			}

			qty = 0;
			elementQty = document.getElementById(elementQtyPrefix+i);
			if(elementQty)
			{
				qty = elementQty.value;							
			}
			else
			{
				alert("element qty not found");
			}

			subtotal = qty * price;
			totalList[getArrayIndex(unit, unitList)] += subtotal;
			elementSubtotal = document.getElementById(elementSubtotalPrefix+i);
			if(elementSubtotal)
			{
				clearChildElement(elementSubtotal);
				elementSubtotal.appendChild(document.createTextNode(elementUnit.value + " " + new NumberFormat(subtotal).toFormatted() + ""));
			}
			else
			{
				alert("element Subtotal NOT found");
			}
		}
		else
		{
			alert("element delete not found");
		}
	}

	elementTotal = document.getElementById(elementTotalPrefix);
	if(elementTotal)
	{
		totalValueText = "";
		for(i=0; i<totalList.length; i++)
		{
			totalValueText += unitList[i] + " " + new NumberFormat(totalList[i]).toFormatted();
			if(i!=totalList.length-1)
			{
				totalValueText += " + ";
			}
		}

		clearChildElement(elementTotal);
		elementTotal.appendChild(document.createTextNode(totalValueText));
	}
	else
	{
		alert("element total not found");
	}
}

function onUpdateQuantity(event, index, productId, priceItemIndex, quantity, simulationIndex)
{
	if(event.keyCode==13)
	{
		updateQuantityAjax(index, productId, priceItemIndex, quantity, simulationIndex);
	}
	else
	{
		return;
	}
}

function updateQuantityAjax(index, productId, priceItemIndex, quantity, simulationIndex)
{
	advAJAX.get({
		url: "shop-management-ajax.jsp",
		parameters : {
			"action" : "shoppingcart-update-ajax",
			"productId" : productId,
			"priceItemIndex" : priceItemIndex,
			"quantity" : quantity,
			"simulationIndex" : simulationIndex
		},
		onSuccess : function(obj)
				{
					// report format: [isSuccess:1|0],[Product Quantity in ShoppingCart:int],[Message:String]
					totalResponse = 3;
					responseSuccess = "0";
					responseProductQuantity = "0";
					responseMessage = "";

					responseList = obj.responseText.split(",", totalResponse);

					if(responseList.length>1)
					{
						responseSuccess = responseList[0];
					}

					if(responseList.length>2)
					{
						responseProductQuantity = responseList[1];
					}

					if(responseList.length>3)
					{
						responseMessage = responseList[2];
					}

					if(responseSuccess=="1")
					{
						elementQty = document.getElementById(elementQtyPrefix+index);
						if(elementQty)
						{
							elementQty.value=1*responseProductQuantity;
						}
						else
						{
							alert("element quantity not found");
						}

						if((1*responseProductQuantity)<1)
						{
							elementDelete = document.getElementById(elementDeletePrefix+index);
							if(elementDelete)
							{
								elementDelete.value=1;
							}
							else
							{
								alert("element delete not found");
							}

							elementItem = document.getElementById(elementItemPrefix+index);
							if(elementItem)
							{
								elementItem.style.display="none";
							}
							else
							{
								alert("element item not found");
							}
						}
						calculate();
					}
					else
					{
						alert("Update fail!");
					}
				},
		onError : function(obj) { alert("Error: " + obj.status); }
	});
}

elementSimulationBasePrefix = "simulation";
elementSimulationContainerPrefix = elementSimulationBasePrefix + "-container-";
elementSimulationLengthPrefix = elementSimulationBasePrefix + "-length-";
elementSimulationIsMultiplePrefix = elementSimulationBasePrefix + "-isMultiple-";
elementSimulationProductCategoryListPrefix = elementSimulationBasePrefix + "-productCategory-";
elementSimulationProductListPrefix = elementSimulationBasePrefix + "-product-";
elementSimulationPriceLabelPrefix = elementSimulationBasePrefix + "-priceLabel-";
elementSimulationPriceActionPrefix = elementSimulationBasePrefix + "-priceAction-";
elementSimulationImagePrefix = elementSimulationBasePrefix + "-image-";
elementSimulationItemPrefix = elementSimulationBasePrefix + "-";
elementSimulationDeletePrefix = elementSimulationBasePrefix + "-delete-";
elementSimulationProductIdPrefix = elementSimulationBasePrefix + "-productId-";
elementSimulationPriceItemIndexPrefix = elementSimulationBasePrefix + "-priceItemIndex-";
elementSimulationAttributeBase = "simulation";
elementSimulationAttributeProductCategoryName = elementSimulationAttributeBase + "_productCategoryName";
elementSimulationAttributeProductCategoryPath = elementSimulationAttributeBase + "_productCategoryPath";
elementSimulationAttributePriceUnit = elementSimulationAttributeBase + "_priceUnit";
elementSimulationAttributePriceAmount = elementSimulationAttributeBase + "_priceAmount";
elementSimulationAttributePriceItemIndex = elementSimulationAttributeBase + "_priceItemIndex";
elementSimulationEntityDelimiter = ":";
elementSimulationLineDelimiter = "\n";

function updateSimulationProductCategory(simulationId)
{
	elementSimulationProductCategoryList = document.getElementById(elementSimulationProductCategoryListPrefix + simulationId);
	elementSimulationProductList = document.getElementById(elementSimulationProductListPrefix + simulationId);
	elementSimulationPriceAction = document.getElementById(elementSimulationPriceActionPrefix + simulationId);

	if(!elementSimulationProductCategoryList.value)
	{
		alert("Product Category not ready");
		return;
	}
	if(!elementSimulationProductList || !elementSimulationPriceAction)
	{
		alert("Update area(s) not ready");
		return;
	}

	advAJAX.get({
		url: "simulation-management-ajax.jsp",
		parameters : {
			"action" : "simulation-update-productCategory",
			"productCategoryId" : elementSimulationProductCategoryList.value
		},
		onSuccess : function(obj)
				{
					// report format:
					// [isSuccess:1|0]
					// [productCategoryName:String]:[productCategoryPath:String]:[priceUnit:String]:[priceAmount:int]:[priceItemIndex:int]:[product id:int]:[productName:String]
					// [productCategoryName:String]:[productCategoryPath:String]:[priceUnit:String]:[priceAmount:int]:[priceItemIndex:int]:[product id:int]:[productName:String]
					// [productCategoryName:String]:[productCategoryPath:String]:[priceUnit:String]:[priceAmount:int]:[priceItemIndex:int]:[product id:int]:[productName:String]
					// ...
					// [productCategoryName:String]:[productCategoryPath:String]:[priceUnit:String]:[priceAmount:int]:[priceItemIndex:int]:[product id:int]:[productName:String]

					totalResponse = 7;
					responseSuccess = "0";
					responseList = obj.responseText.trim().split(elementSimulationLineDelimiter);

					if(responseList.length>0 && responseList[0].trim()!="")
					{
						responseSuccess = responseList[0].trim();
					}

					if(responseSuccess=="1")
					{
						clearChildElement(elementSimulationProductList);
						elementSimulationPriceAction.style.visibility = "hidden";

						elementOption = document.createElement("option");
						elementOption.value = "-1";
						elementOption.text = "Select Product";
						elementOption.selected = "true";
						elementOption.disabled = "disabled";
						try
						{
							elementSimulationProductList.add(elementOption, null); // standards compliant; doesn't work in IE
						}
						catch(ex)
						{
							elementSimulationProductList.add(elementOption); // IE only
						}

						for(i=1; i<responseList.length; i++)
						{
							productId = -1;
							productName = "";
							productCategoryName = "";
							productCategoryPath = "";
							priceUnit = "";
							priceAmount = "";
							priceItemIndex = "";

							entityList = responseList[i].trim().split(elementSimulationEntityDelimiter, totalResponse);
							if(entityList.length>0 && entityList[0].trim()!="")
							{
								productCategoryName = entityList[0].trim();
							}
							if(entityList.length>1)
							{
								productCategoryPath = entityList[1].trim();
							}
							if(entityList.length>2)
							{
								priceUnit = entityList[2].trim();
							}
							if(entityList.length>3)
							{
								priceAmount = entityList[3].trim();
							}
							if(entityList.length>4)
							{
								priceItemIndex = entityList[4].trim();
							}
							if(entityList.length>5)
							{
								productId = entityList[5].trim();
							}
							if(entityList.length>6)
							{
								productName = entityList[6].trim();
							}

							elementOption = document.createElement("option");
							elementOption.value = productId;
							elementOption.text = productName;
							elementOption.setAttribute(elementSimulationAttributeProductCategoryName, productCategoryName);
							elementOption.setAttribute(elementSimulationAttributeProductCategoryPath, productCategoryPath);
							elementOption.setAttribute(elementSimulationAttributePriceUnit, priceUnit);
							elementOption.setAttribute(elementSimulationAttributePriceAmount, priceAmount);
							elementOption.setAttribute(elementSimulationAttributePriceItemIndex, priceItemIndex);

							try
							{
								elementSimulationProductList.add(elementOption, null); // standards compliant; doesn't work in IE
							}
							catch(ex)
							{
								elementSimulationProductList.add(elementOption); // IE only
							}
						}
					}
					else
					{
						alert("Update fail.");
					}
				},
		onError : function(obj) { alert("Error: " + obj.status); }
	});
}

function updateSimulationProduct(simulationId)
{
	elementSimulationProductList = document.getElementById(elementSimulationProductListPrefix + simulationId);
	elementSimulationPriceAction = document.getElementById(elementSimulationPriceActionPrefix + simulationId);
	elementSimulationPriceLabel = document.getElementById(elementSimulationPriceLabelPrefix + simulationId);
	elementSimulationImage = document.getElementById(elementSimulationImagePrefix + simulationId);

	if(!elementSimulationProductList.value)
	{
		alert("Product not ready");
		return;
	}
	if(!elementSimulationPriceAction || !elementSimulationPriceLabel || !elementSimulationImage)
	{
		alert("Update area(s) not ready");
		return;
	}
	selectedOption = elementSimulationProductList.options[elementSimulationProductList.selectedIndex];
	productId = selectedOption.value;
	productName = selectedOption.text;
	priceUnit = selectedOption.getAttribute(elementSimulationAttributePriceUnit);
	priceAmount = selectedOption.getAttribute(elementSimulationAttributePriceAmount);
	priceItemIndex = selectedOption.getAttribute(elementSimulationAttributePriceItemIndex);
	productCategoryName = selectedOption.getAttribute(elementSimulationAttributeProductCategoryName);
	productCategoryPath = selectedOption.getAttribute(elementSimulationAttributeProductCategoryPath);

	clearChildElement(elementSimulationPriceLabel);
	elementSimulationPriceLabel.appendChild(document.createTextNode(priceUnit + " " + new NumberFormat(priceAmount).toFormatted()));
	elementSimulationPriceAction.style.visibility = "visible";
	elementSimulationImage.src = "images/product/" + productId + "-t.jpg" + "?" + escape(new Date());
}

function addSimulationProduct(simulationId)
{
	elementSimulationContainer = document.getElementById(elementSimulationContainerPrefix + simulationId);
	elementSimulationIsMultiple = document.getElementById(elementSimulationIsMultiplePrefix + simulationId);
	elementSimulationLength = document.getElementById(elementSimulationLengthPrefix + simulationId);

	elementSimulationProductList = document.getElementById(elementSimulationProductListPrefix + simulationId);


	if(!elementSimulationLength || !elementSimulationIsMultiple || !elementSimulationProductList)
	{
		alert("Required Element(s) not ready");
		return;
	}

	if(!elementSimulationContainer)
	{
		alert("Update Element(s) not ready");
		return;
	}

	selectedOption = elementSimulationProductList.options[elementSimulationProductList.selectedIndex];
	productId = selectedOption.value;
	productName = selectedOption.text;
	priceUnit = selectedOption.getAttribute(elementSimulationAttributePriceUnit);
	priceAmount = selectedOption.getAttribute(elementSimulationAttributePriceAmount);
	priceItemIndex = selectedOption.getAttribute(elementSimulationAttributePriceItemIndex);
	productCategoryName = selectedOption.getAttribute(elementSimulationAttributeProductCategoryName);
	productCategoryPath = selectedOption.getAttribute(elementSimulationAttributeProductCategoryPath);

	oldIndex = (1*elementSimulationLength.value)-1;
	newIndex = oldIndex+1;
	elementSimulationLength.value = (1*elementSimulationLength.value)+1;

	elementSimulationItem = document.createElement("div");
	elementSimulationItem.className = "simulationItemProductItem";
	elementSimulationItem.id = elementSimulationBasePrefix + simulationId + "-" + newIndex;
		elementSimulationInputDelete = document.createElement("input");
		elementSimulationInputDelete.type = "hidden";
		elementSimulationInputDelete.id = elementSimulationDeletePrefix + simulationId + "-" + newIndex;
		elementSimulationInputDelete.name = elementSimulationDeletePrefix + simulationId + "-" + newIndex;
		elementSimulationInputDelete.value = "0";
	elementSimulationItem.appendChild(elementSimulationInputDelete);
		elementSimulationInputProduct = document.createElement("input");
		elementSimulationInputProduct.type = "hidden";
		elementSimulationInputProduct.name = elementSimulationProductIdPrefix + simulationId + "-" + newIndex;
		elementSimulationInputProduct.value = productId;
	elementSimulationItem.appendChild(elementSimulationInputProduct);
		elementSimulationInputPriceItemIndex = document.createElement("input");
		elementSimulationInputPriceItemIndex.type = "hidden";
		elementSimulationInputPriceItemIndex.name = elementSimulationPriceItemIndexPrefix + simulationId + "-" + newIndex;
		elementSimulationInputPriceItemIndex.value = priceItemIndex;
	elementSimulationItem.appendChild(elementSimulationInputPriceItemIndex);
		elementSimulationProductCategory = document.createElement("div");
		elementSimulationProductCategory.className = "simulationItemProductItemCategory";
			elementSimulationProductCategoryLabel = document.createElement("span");
			elementSimulationProductCategoryLabel.className = "black small";
			elementSimulationProductCategoryLabel.appendChild(document.createTextNode(productCategoryName));
			elementSimulationProductCategoryLabel.title = productCategoryPath;
		elementSimulationProductCategory.appendChild(elementSimulationProductCategoryLabel);
	elementSimulationItem.appendChild(elementSimulationProductCategory);
		elementSimulationProduct = document.createElement("div");
		elementSimulationProduct.className = "simulationItemProductItemName";
			elementSimulationProductLabel = document.createElement("span");
			elementSimulationProductLabel.className = "black small";
			elementSimulationProductLabel.appendChild(document.createTextNode(productName));
		elementSimulationProduct.appendChild(elementSimulationProductLabel);
	elementSimulationItem.appendChild(elementSimulationProduct);
		elementSimulationPrice = document.createElement("div");
		elementSimulationPrice.className = "simulationItemProductItemPrice";
		elementSimulationPrice.innerHTML = "<span class=\"black small\">" + priceUnit + " " + new NumberFormat(priceAmount).toFormatted() + "</span><input class=\"simulationInputRemove\" type=\"button\" onClick=\"removeSimulationProduct('" + simulationId + "', '" + newIndex + "')\" />";
	elementSimulationItem.appendChild(elementSimulationPrice);
		elementSimulationImagePanel = document.createElement("div");
		elementSimulationImagePanel.className = "simulationItemProductItemImagePanel";
			elementSimulationImage = document.createElement("img");
			elementSimulationImage.className = "simulationItemProductItemImage";
			elementSimulationImage.src = "./images/product/" + productId + "-t.jpg";
		elementSimulationImagePanel.appendChild(elementSimulationImage);
	elementSimulationItem.appendChild(elementSimulationImagePanel);

	elementSimulationContainer.appendChild(elementSimulationItem);

	if(elementSimulationIsMultiple.value!="1" && oldIndex!=-1)
	{
		// not multiple
		removeSimulationProduct(simulationId, oldIndex);
	}
}

function removeSimulationProduct(simulationId, simulationProductIndex)
{
	elementSimulationDelete = document.getElementById(elementSimulationDeletePrefix + simulationId + "-" + simulationProductIndex);
	elementSimulationItem = document.getElementById(elementSimulationBasePrefix + simulationId + "-" + simulationProductIndex);

	if(!elementSimulationDelete)
	{
		alert("Required Element(s) nor ready.");
		return;
	}

	if(!elementSimulationItem)
	{
		update("Required Element(s) nor ready.");
		return;
	}

	elementSimulationDelete.value = 1;
	elementSimulationItem.style.display = "none";
}
