﻿// Globals.
var globalVisiblePanel;

// AddAlert: 1-Did, 2-Name, 3-Price, 4-AddSpan, 5-RemoveSpan.
// UpdateAlert: 1-Did, 2-Price, 3-AddSpan, 4-RemoveSpan.
var globalParam1;
var globalParam2;
var globalParam3;
var globalParam4;
var globalParam5;
var feedList;
var lastFeedIndex;

var statusType = {
	Error: 0,
	Wait: 1,
	Success: 2
};

var fieldType = {
	AnyValue : 0,
	Email : 1,
	Password: 2,
	Price : 3
};

// AJAX.
function createHttpRequest(url) {
	var instance;

	if (window.XMLHttpRequest) {
		instance = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) {
		try {
			instance = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				instance = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) { }
		}
	}

	if (instance != null && url != null) {
		if (url.indexOf('?') == -1) {
			url = url + '?xr=' + Math.floor(Math.random() * 16384);
		} else {
			url = url + '&xr=' + Math.floor(Math.random() * 16384);
		}

		instance.open('GET', url, true);
	}

	return instance;
}

// Cookie Management.
function setCookie(key, value, expiryDays) {
	var expires = '';
	var date = new Date();

	date.setTime(date.getTime() + (expiryDays * 24 * 60 * 60 * 1000));
	expires = date.toGMTString();
	document.cookie = key + '=' + value + '; expires=' + expires + '; path=/';
}

function getCookie(key) {
	var index;
	var endIndex;
	var value;

	key = key + '=';
	index = document.cookie.indexOf(key);
	if (index >= 0) {
		index += key.length;
		endIndex = document.cookie.indexOf(';', index);
		if (endIndex == -1) {
			endIndex = document.cookie.length - 1;
		} else {
			endIndex--;
		}
		
		value = document.cookie.substr(index, endIndex - index + 1);
	}

	return value;
}

// Panel Management.
function showPanel(id, url, param1, param2, param3, param4, param5) {
	var panel = document.getElementById(id);
	var posX, posY, request;

	hidePanel();
	if (panel.offsetWidth > document.documentElement.clientWidth) {
		posX = 0;
	} else {
		posX = (document.documentElement.clientWidth - panel.offsetWidth) / 2;
	}

	if (panel.offsetHeight > document.documentElement.clientHeight) {
		posY = 0;
	} else {
		posY = (document.documentElement.clientHeight - panel.offsetHeight) / 2;
	}

	panel.style.left = posX + 'px';
	panel.style.top = posY + 'px';
	panel.style.border = '1px';
	panel.innerHTML = '<div align="center" style="padding: 10px;">Please Wait...</div>';
	panel.style.visibility = 'visible';
	globalVisiblePanel = id;
	globalParam1 = param1;
	globalParam2 = param2;
	globalParam3 = param3;
	globalParam4 = param4;
	globalParam5 = param5;

	request = createHttpRequest(url);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				panel.style.borderWidth = '0px';
				panel.innerHTML = request.responseText;

				// Specialize form.
				if (id == 'DivAddAlertPanel') {
					document.getElementById('DivAddAlertName').innerHTML = globalParam2;
					document.getElementById('DivAddAlertPrice').value = globalParam3 + '';
				}
			} else {
				panel.innerHTML = '<p>&nbsp;</p><p align="center" style="color: #FF0000">An unknown error occurred.</p><p align="center"><img style="vertical-align:middle" src="/images/button_cancel.jpg" width="20" height="20" alt="Close" /><a href="javascript:void(0);" onclick="javascript:hidePanel();">Close</a></p>';
			}
		}
	}

	request.send(null);   
}

function hidePanel() {
	if (globalVisiblePanel != null) {
		document.getElementById(globalVisiblePanel).style.visibility = 'hidden';
		globalVisiblePanel = null;
	}
}

// Utility Functions.
function trim(buffer) {
	var output = '';
	var index = 0;

	for (index = 0; index < buffer.length && buffer.charAt(index) == ' '; index++);
	output = buffer.substr(index);

	if (output.length > 0) {
		index = output.length - 1;
		while (index > 0) {
			if (output.charAt(index) != ' ') {
				break;
			}

			index--;
		}

		output = output.substr(0, index + 1);
	}

	return output;
}

function getInnerText(obj) {
	if (obj.innerText) {
		return obj.innerText;
	}
	return obj.textContent;
}

function setInnerText(obj, value) {
	if (obj.innerText) {
		obj.innerText = value;
	} else {
		obj.textContent = value;
	}
}

// Field Validation.
function updateStatus(msgid, msgType, message) {
	var element = document.getElementById(msgid);

	if (msgType == statusType.Error) {
		element.style.color = '#ff0000';
	} else if (msgType == statusType.Wait) {
		element.style.color = '#000000';
		if (message == null) {
			message = '<img src="/images/please_wait.gif" style="vertical-align: middle;" /> Please Wait...';
		}
	} else {
		element.style.color = '#000';
	}

	element.innerHTML = message;
}

function validateField(id, fldtype, statusid) {
	var value = document.getElementById(id).value;
	var element;
	
	if (fldtype != fieldType.Password) {
		value = trim(value);
	}

	if (fldtype == fieldType.Email) {
		if (value.indexOf('@') == -1) {
			value = '';
		}
	} else if (fldtype == fieldType.Price) {
		if (isNaN(parseFloat(value))) {
			value = '';
		}
	}

	if (statusid != null) {
		element = document.getElementById(statusid);
		if (value.length > 0) {
			element.style.color = '#000';
		} else {
			element.style.color = '#ff0000';
		}
	}

	if (value.length == 0) {
		value = null;
	} 
	
	return value;
}

// Form Processing.
function emailFriend() {
	var email = validateField('DivEmailFriendEmail', fieldType.Email, 'DivEmailFriendEStatus');
	var name = validateField('DivEmailFriendName', fieldType.AnyValue, 'DivEmailFriendNStatus');
	var message = document.getElementById('DivEmailFriendMessage').value;

	if (name == null) {
		updateStatus('DivEmailFriendStatus', statusType.Error, 'Enter your Name.');
	} else if (email == null) {
		updateStatus('DivEmailFriendStatus', statusType.Error, 'Enter valid Email address.');
	} else {
		updateStatus('DivEmailFriendStatus', statusType.Wait);

		request = createHttpRequest('/services/emailfriend.aspx?did=' + encodeURIComponent(globalParam1) + '&n=' + encodeURIComponent(name) + '&e=' + encodeURIComponent(email) + '&m=' + encodeURIComponent(message));
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					updateStatus('DivEmailFriendStatus', statusType.Success, 'Email sent successfully. If you would like to send to another friend, just enter the Email address and click on Submit button.');
				} else {
					updateStatus('DivEmailFriendStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}
}

function loginUser() {
	var username = validateField('DivLoginUserName', fieldType.AnyValue, 'DivLoginUStatus');
	var password = validateField('DivLoginPassword', fieldType.Password, 'DivLoginPStatus');
	var request;
	var userinfo;
	var alert;
	
	if (username == null) {
		updateStatus('DivLoginStatus', statusType.Error, 'Enter your User Name.');
	} else if (password == null) {
		updateStatus('DivLoginStatus', statusType.Error, 'Enter your Password.');
	} else {
		updateStatus('DivLoginStatus', statusType.Wait);
		request = createHttpRequest('/services/login.aspx?u=' + encodeURIComponent(username) + '&p=' + encodeURIComponent(password));
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					if (request.responseText.indexOf('-1') != -1) {
						updateStatus('DivLoginStatus', statusType.Error, 'Invalid User Name or Password specified.');
					} else {
						userinfo = request.responseText.split(';');
						setCookie('UID', trim(userinfo[0]), 365);
						setCookie('CID', trim(userinfo[1]), 365);
						setCookie('UN', trim(userinfo[2]), 365);

						for (i = 3; i < userinfo.length; i++) {
							if (userinfo[i].substr(0, 10) == 'showAlert-') {
								alert = document.getElementById(userinfo[i].substr(10));
								if (alert != null) {
									alert.style.display = 'inline'; 
								}
							} else if (userinfo[i].substr(0, 10) == 'hideAlert-') {
								alert = document.getElementById(userinfo[i].substr(10));
								if (alert != null) {
									alert.style.display = 'none';
								}
							}
						}

						updateUserState();
						hidePanel();
					}
				} else {
					updateStatus('DivLoginStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}
}

function logoutUser() {
	var addRE = new RegExp('SpanAddAlert*');
	var removeRE = new RegExp('SpanRemoveAlert*');
	var all;
	var element;

	if (document.all) {
		all = document.all;
	} else {
		all = document.getElementsByTagName('body')[0].getElementsByTagName('*');
	}
	
	for (i = 0; i < all.length; i++) {
		element = all[i]
		if (addRE.test(element.id)) {
			element.style.display = 'inline';
		} else if (removeRE.test(element.id)) {
			element.style.display = 'none';
		}
	}

	setCookie('UID', -1, -365);
	setCookie('CID', -1, -365);
	setCookie('UN', -1, -365);
	updateUserState();
}

function signupUser() {
	var username = validateField('DivSignupUserName', fieldType.AnyValue, 'DivSignupUStatus');
	var email = validateField('DivSignupEmail', fieldType.Email, 'DivSignupEStatus');
	var password1 = validateField('DivSignupPassword', fieldType.Password, 'DivSignupPStatus');
	var password2 = validateField('DivSignupPassword2', fieldType.Password, 'DivSignupP2Status');
	var request;
	
	if (username == null) {
		updateStatus('DivSignupStatus', statusType.Error, 'Enter a valid User Name.');
	} else if (email == null) {
		updateStatus('DivSignupStatus', statusType.Error, 'Enter a valid Email address.');
	} else if (password1 == null || password2 == null) {
		updateStatus('DivSignupStatus', statusType.Error, 'Enter a valid Password.');
	} else if (password1 != password2) {
		updateStatus('DivSignupStatus', statusType.Error, 'Passwords do not match.');
	} else {
		updateStatus('DivSignupStatus', statusType.Wait);
		request = createHttpRequest("/services/signup.aspx?u=" + encodeURIComponent(username) + "&p=" + encodeURIComponent(password1) + "&e=" + encodeURIComponent(email));
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					if (request.responseText.indexOf('-1;') != -1) {
						updateStatus('DivSignupStatus', statusType.Error, request.responseText.substr(3));
					} else {
						showPanel('DivSignupDonePanel', '/SignupDonePanel.html');
					}
				} else {
					updateStatus('DivSignupStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}
}

function forgotUser() {
	var username = validateField('DivForgotUserName', fieldType.AnyValue);
	var email = validateField('DivForgotEmail', fieldType.Email);
	var request;

	if (username == null && email == null) {
		updateStatus('DivForgotStatus', statusType.Error, 'Enter your User Name or Email address.');
	} else {
		username = (username == null) ? '' : username;
		email = (email == null) ? '' : email;
		updateStatus('DivForgotStatus', statusType.Wait);
		request = createHttpRequest('/services/forgot.aspx?u=' + encodeURIComponent(username) + '&e=' + encodeURIComponent(email));
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					if (request.responseText.indexOf('-1;') != -1) {
						updateStatus('DivForgotStatus', statusType.Error, request.responseText.substr(3));
					} else {
						showPanel('DivForgotDonePanel', '/ForgotDonePanel.html');
					}
				} else {
					updateStatus('DivForgotStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}
}

function addAlertPanel(derivedid, name, price, spanAdd, spanRemove) {
	var user = getUser();

	if (user == null) {
		showPanel('DivLoginRequiredPanel', '/LoginRequiredPanel.html');
	} else {
		showPanel('DivAddAlertPanel', '/AddAlertPanel.html', derivedid, name, price, spanAdd, spanRemove);
	}
}

function addAlert() {
	var price = validateField('DivAddAlertPrice', fieldType.Price);
	var request;
	
	if (price == null) {
		updateStatus('DivAddAlertStatus', statusType.Error, 'Specify a valid Price for Email Alerts.');
	} else if (parseFloat(price) > parseFloat(globalParam3)) {
		updateStatus('DivAddAlertStatus', statusType.Error, 'The current price of the product is already below the specified price.');
	} else {
		updateStatus('DivAddAlertStatus', statusType.Wait);
		request = createHttpRequest('/services/alertlist.aspx?op=add&did=' + globalParam1 + '&tp=' + price);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					hidePanel();
					document.getElementById(globalParam4).style.display = 'none';
					document.getElementById(globalParam5).style.display = 'inline';
				} else {
					updateStatus('DivAddAlertStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}        
}

function updateAlertPanel(derivedid, price, spanAdd, spanRemove) {
	var user = getUser();

	if (user == null) {
		showPanel('DivLoginRequiredPanel', '/LoginRequiredPanel.html');
	} else {
		showPanel('DivUpdateAlertPanel', '/UpdateAlertPanel.aspx?did=' + derivedid, derivedid, price, spanAdd, spanRemove);
	}
}

function updateAlert() {
	var price = validateField('DivUpdateAlertPrice', fieldType.Price);
	var request;

	if (price == null) {
		updateStatus('DivUpdateAlertStatus', statusType.Error, 'Specify a valid Price for Email Alerts.');
	} else if (parseFloat(price) > parseFloat(globalParam2)) {
		updateStatus('DivUpdateAlertStatus', statusType.Error, 'The current price of the product is already below the specified price.');
	} else {
		updateStatus('DivUpdateAlertStatus', statusType.Wait);
		request = createHttpRequest('/services/alertlist.aspx?op=update&did=' + globalParam1 + '&tp=' + price);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					hidePanel();
				} else {
					updateStatus('DivUpdateAlertStatus', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	} 
}

function removeAlert() {
	var request;

	updateStatus('DivUpdateAlertStatus', statusType.Wait);
	request = createHttpRequest('/services/alertlist.aspx?op=remove&did=' + globalParam1);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				hidePanel();
				document.getElementById(globalParam3).style.display = 'inline';
				document.getElementById(globalParam4).style.display = 'none';
			} else {
				updateStatus('DivUpdateAlertStatus', statusType.Error, 'An unknown error has occurred.');
			}
		}
	}

	request.send(null);
}

// Misc Functions.
function getUser() {
	var uid = getCookie('UID');
	var cid = getCookie('CID');
	var uname = getCookie('UN');
	var user;

	if (uid != null && cid != null && uname != null) {
		user = new Object();
		user.userid = uid;
		user.cid = cid;
		user.username = uname;
	}

	return user;
}

function updateUserState() {
    var user = getUser();

    if (location.pathname.substr(0, 9) == '/account/') {
        return;
    }

	if (user == null) {
		document.getElementById('SpanLogin').style.visibility = 'visible';
		document.getElementById('SpanMyAccount').style.visibility = 'hidden';
	} else {
		document.getElementById('SpanLogin').style.visibility = 'hidden';
		document.getElementById('SpanMyAccount').style.visibility = 'visible';
		document.getElementById('SpanMyAccountName').innerHTML = user.username;
	}
}

// Page Events.
function onPageResize() {
	var pageContent = document.getElementById('PageContent');
	if (document.documentElement.clientWidth < 1000) {
		pageContent.style.width = '1000px';
	} else {
		pageContent.style.width = '100%';
	}
}

function onPageLoad(resize) {
	var pleaseWaitImage = new Image();
	var eBayURL;
	var chartURL;
	var AzURL;
	var request;
	var chartRequest;
	var azRequest;
	
	pleaseWaitImage.src = '/images/please_wait.gif';
	updateUserState();

	if (resize == null || resize == true) {
		onPageResize();
	}

	eBayURL = document.getElementById('DivEBayURL');
	if (eBayURL != null) {
		request = createHttpRequest(getInnerText(eBayURL));
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					document.getElementById('DivEBay').innerHTML = request.responseText;
				} else {
				updateStatus('DivEBay', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		request.send(null);
	}

	AzURL = document.getElementById('DivAzURL');
	if (AzURL != null) {
		azRequest = createHttpRequest(getInnerText(AzURL));
		azRequest.onreadystatechange = function() {
			if (azRequest.readyState == 4) {
				if (azRequest.status == 200) {
					document.getElementById('DivAz').innerHTML = azRequest.responseText;
				} else {
					updateStatus('DivAz', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		azRequest.send(null);
	}

	chartURL = document.getElementById('DivAggPriceChartURL');
	if (chartURL != null) {
		chartRequest = createHttpRequest(getInnerText(chartURL));
		chartRequest.onreadystatechange = function() {
			if (chartRequest.readyState == 4) {
				if (chartRequest.status == 200) {
					document.getElementById('DivAggPriceChart').innerHTML = chartRequest.responseText;
				} else {
					updateStatus('DivAggPriceChart', statusType.Error, 'An unknown error has occurred.');
				}
			}
		}

		chartRequest.send(null);
	}

	productStatInterval();
	window.setInterval(productStatInterval, 4000);
}

function productStatInterval() {
	if (feedList == null) {
		var element = document.getElementById('SpanNewsFeed');
		if (element != null) {
			feedList = element.innerHTML.split('#');
			lastFeedIndex = Math.floor(Math.random() * feedList.length);
		}
	}

	if (feedList != null) {
		document.getElementById('SpanNewsTicker').innerHTML = feedList[lastFeedIndex];
		lastFeedIndex++;
		if (lastFeedIndex >= feedList.length) {
			lastFeedIndex = 0;
		}
	}
}

function display(id, show) {
	var e = document.getElementById(id);
	if (show) { e.style.display = 'inline'; }
	else { e.style.display = 'none'; }
}

function openWindow(url) {
	var oWindow;

	oWindow = window.open(url, "", "height=400,width=650,toolbar=0,menubar=0,scrollbars=1,resizable=1");
	if (window.focus) { window.focus(); }
}
