Effect.DefaultOptions.duration = '0.3';

if (Prototype.Browser.IE) Prototype.Browser[window.XMLHttpRequest ? 'IE7' : 'IE6'] = true;

var app = 
{
	debug: true,
	
	strings: {
		err_timeout: 'Your request has timed out. Please try again shortly.',
		err_fatal: 'A fatal error has occurred. Please try again shortly.'
	},
	
	doCheck: function(check)
	{
		if (check.checked) check.form[check.name+'Value'].value = check.value;
		else check.form[check.name+'Value'].value = '';
	},
	
	clearOnFocus: function(input)
	{
		input.value = '';
		$(input).addClassName('active');
		input.onfocus = function() {};
	},
	
	emailFocus: function(input)
	{
		if (!window.friendCount) window.friendCount = 0;
		input.value = '';
		$(input).addClassName('active');
		
		if (window.friendCount < 10) {
			window.friendCount++;
			var container = $$('#findColleagues .inputs').first();
			container.insert('<input class="name" name="friendsName[]" type="text" value="Name" onfocus="app.clearOnFocus(this)" /><input class="email" name="friendsEmail[]" type="text" value="Email" onfocus="app.emailFocus(this)" />', { position: 'bottom'});
		}
		input.onfocus = function() {};		
	},
	
	moreLess: function(link, summary, fullText)
	{
		try {
			var summary = $$(summary).first();
			var fullText = $$(fullText).first();
			if (typeof(link) == "string") 
			{
				link = $$(link);
				if (link && link.length) link = link.first();
				else link = false;
			}
			if (!link || !$(link)) link = false;
			if (!summary || !fullText) return;
		} catch(e) {
			return;
		}
		
		if (link && link.hasClassName('less'))
		{
			summary.show();
			fullText.hide();
			if (link) link.removeClassName('less');
		}
		else
		{
			summary.hide();
			fullText.show();
			if (link) link.addClassName('less');			
		}
	},
	
	resetOnFocus: function(input)
	{
		if (input.value != input.defaultValue)
		{
			input.removeClassName('active');										
			input.value = input.defaultValue;
			input.onfocus = function() { app.clearOnFocus(input); }
		}		
	},
	
	blackOnFocus: function(input)
	{
		$(input).addClassName('active');		
		input.onfocus = function() {};
	},	
	
	clearFile: function(old)
	{
		var file = document.createElement('input');
		file.className = old.className;
		file.type = old.type;
		file.name = old.name;
		old.up().insertBefore(file, old);
		old.remove();
		return file;
	},		
	
	hideNotice: function(e, elm, notice)
	{
		Event.stop(event);		
		new Effect.Fade($(elm));
		new Ajax.Request('/notice/'+notice+'/');
	},
	
	selectParagraph: function(s)
	{
		$(s).up().select('p').each(function(x, i) { i == s.value ? x.show() : x.hide() });
	},
	
	jump: function(id)
	{
		if (!id) return;
		Cookie.set('jump', id);
	},
	
	scroll: function(div)
	{
		if ($(div)) 
			Effect.ScrollTo(div);
	},
	
	preload: function(images)
	{
		if (!images || !images.length) return;

		for (var i=0; i<images.length; i++) {
			var img = new Image();			
			img.src = images[i];
		}
	},
		
	jsonLoad: function(url, args)
	{
		if (!args) args = {};
		
		var timeout;
		var preventLoading = false; // PREVENT RACE CONDITION

		var fn = function()
		{
			new Ajax.Request(
				url,
				{
					method: args.parameters ? 'post' : 'get', 
					parameters: args.parameters,
					maxExecutionTime: args.maxExecutionTime,					
					onLoading: function() {					
						if (preventLoading) return; 
					},
					onComplete: function(req) {

						if (req.status == 401 || req.status == 403)
							return;
				
						preventLoading = true;
						if (args.commonCallback) args.commonCallback();

						try {
							var json = req.responseText.evalJSON(true);					    
						} catch (e) { 
							if (args.errorCallback) args.errorCallback();
							return; 
						}

						if (req.responseText == '[]') json = {};

						if (args.loading && (!(args.keepLoading && json.url))) args.loading.hide();

						if (!json)
						{
							if (args.errorCallback) args.errorCallback();
							return;
						}
					
						if (args.callback) {
							if (!json) json = {};
							args.callback(json);
						}
					},
					on401: function(request)
					{
						if (window.loginbox)
							window.loginbox.show();
						
						preventLoading = true;
						if (args.loading) args.loading.hide();		
						if (args.commonCallback) args.commonCallback();													
						if (args.loggedOutCallback) args.loggedOutCallback();					
					},				
					on403: function(request)
					{
						if (window.permissionbox)
							window.permissionbox.show();

						preventLoading = true;
						if (args.loading) args.loading.hide();			
						if (args.commonCallback) args.commonCallback();												
						if (args.forbiddenCallback) args.forbiddenCallback();					
					},								
					onException: function() {
						preventLoading = true;
						if (args.loading) args.loading.hide();	
						if (args.commonCallback) args.commonCallback();										
						if (args.errorCallback) args.errorCallback();
					},
					onFailure: function() {
						preventLoading = true;
						if (args.loading) args.loading.hide();	
						if (args.commonCallback) args.commonCallback();										
						if (args.errorCallback) args.errorCallback();				
					}
				});
		}
			
		if (args.loading)
		{
			args.loading.show();
			setTimeout(fn, 500);
		}
		else fn();		
		
		return true;
	},
	
	blockLoad: function(block, element, url, args)
	{
		if (!$(element))
			return false;
	//alert(url);

		if (!args) args = {};

		var timeout;
		var preventLoading = false; // PREVENT RACE CONDITION

		var params = args.parameters || {};
		params.block = block;

	//alert(url);
		var fn = function()
		{
			new Ajax.Updater(
				element,
				url,
				{
					method: args.parameters ? 'post' : 'get', 
					parameters: params,
					evalScripts: true,
					insertion: args.insertion,
					onLoading: function() {
						if (preventLoading) return; 
					},
					on401: function(request)
					{
						if (window.loginbox)
							window.loginbox.show();
						request.responseText = $(element).innerHTML;
				
						preventLoading = true;
						clearTimeout(timeout);	
						if (args.loading) args.loading.hide();
						if (args.commonCallback) args.commonCallback();														
						if (args.loggedOutCallback) args.loggedOutCallback();					
					},
					on403: function(request)
					{
						if (window.permissionbox)
							window.permissionbox.show();
						request.responseText = $(element).innerHTML;
				
						preventLoading = true;
						clearTimeout(timeout);	
						if (args.loading) args.loading.hide();		
						if (args.commonCallback) args.commonCallback();												
						if (args.forbiddenCallback) args.forbiddenCallback();					
					},	
					onComplete: function(req, json) {
						if (req.status == 401 || req.status == 403)
							return;
				
						preventLoading = true;
						clearTimeout(timeout);
						if (args.loading) args.loading.hide();
						if (args.commonCallback) args.commonCallback();					
						if (args.callback) {
							if (!json) json = {};						
							args.callback(json);					
						}
					},
					onException: function() {
						preventLoading = true;
						clearTimeout(timeout);
						if (args.loading) args.loading.hide();	
						if (args.commonCallback) args.commonCallback();									
						if (args.errorCallback) args.errorCallback();
					},
					onFailure: function() {
						preventLoading = true;
						clearTimeout(timeout);		
						if (args.loading) args.loading.hide();	
						if (args.commonCallback) args.commonCallback();											
						if (args.errorCallback) args.errorCallback();				
					}
				});
		}
		
		if (args.loading)
		{
			args.loading.show();
			setTimeout(fn, 500);
		}
		else fn();		
				
		return true;
	},
	
	selectHide: function()
	{
		// Z-INDEX IS BROKEN FOR SELECTS IN IE6		
		if (Prototype.Browser.IE6)
		{
			var elements = document.getElementsByTagName('select');
		    for (var i=0; i<elements.length; i++)
	        	elements[i].style.visibility = 'hidden';
		}		
	},
	
	selectShow: function()
	{
		// Z-INDEX IS BROKEN FOR SELECTS IN IE6
		if (Prototype.Browser.IE6)
		{
			var elements = document.getElementsByTagName('select');
		    for (var i=0; i<elements.length; i++)
	        	elements[i].style.visibility = 'visible';
		}		
	}		
}

app.lightbox = Class.create({
	
	initialize: function(content, width, height, args)
	{
		this.overlay = $('pageoverlay');
		this.lightbox = $('lightbox');
		this.content = $(content);
		
		this.width = width;
		this.height = height;
		
		if (args)
		{
			this.before = args.before;
			this.after = args.after;
			if (args.lightbox) this.lightbox = $(args.lightbox);
		}
		
		this.allowClose = true;
		
		this.lightbox.update('');
		this.lightbox.appendChild(this.content);
		this.content.show();
	},
	
	visible: function()
	{
		return this.lightbox.visible();
	},
	
	show: function(onClose)
	{
		this.onClose = onClose;
		
		if (this.before)
			this.before();
			
		// POSITION FIXED IS BROKEN IN IE6		
		if (this.overlay.getStyle('position') == 'absolute')
		{
			this.overlay.setStyle({
				width: (document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollWidth : document.body.offsetWidth) + 'px', 
				height: (document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight) + 'px'
			});			
		}

		var x = Math.round(((window.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth)) - this.width) / 2);
		var y = Math.round(((window.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight)) - this.height) / 2);

		// SAFARI HAS PROBLEMS WITH OVERFLOW AUTO AND FIXED POSITIONING
		if (Prototype.Browser.WebKit)
			this.lightbox.setStyle({position: 'absolute'});

		// POSITION FIXED IS BROKEN IN IE6
		if (this.lightbox.getStyle('position') == 'absolute')
		{
			x += (window.pageXOffset || (document.documentElement.scrollLeft || document.body.scrollLeft));
			y += (window.pageYOffset || (document.documentElement.scrollTop || document.body.scrollTop));

			app.selectHide();
		}

		this.lightbox.setStyle({left: (x > 0 ? x : 0) + 'px', top: (y > 0 ? y : 0) + 'px'});

		var obj = this;		
		var effects = [];
		
		effects.push(new Effect.Appear(this.lightbox, {from: 0.0, to: 0.999999, duration: 0.5, sync:true}));
		if (!this.overlay.visible()) effects.push(new Effect.Appear(this.overlay, {from: 0.0, to: 0.8, duration: 0.5, sync:true}));
		
		new Effect.Parallel(effects,
							{afterFinish: function()
								{
									obj.overlay.onclick = function() { 
										delete obj.after;										
										if (obj.allowClose) 
											obj.hide(); 
									}.bindAsEventListener(this);
									obj.lightbox.setOpacity('');
								}
							});
	},
	
	hide: function()
	{
		var obj = this;		
				
		new Effect.Parallel([new Effect.Fade(this.overlay, {from: 0.8, to: 0.0, duration: 0.5, sync:true}),	
							new Effect.Fade(this.lightbox, {from: 0.999999, to: 0.0, duration: 0.5, sync:true})],
							{afterFinish: function()
								{
									obj.overlay.onclick = function() { };
									obj.lightbox.setOpacity('');
																		
									app.selectShow();
											
									if (obj.onClose)
										obj.onClose();									
																		
									if (obj.after) {
										obj.after();
										delete obj.after;
									}
								}
							});		
	},
	
	hideLite: function()
	{
		var obj = this;		

		new Effect.Fade(this.lightbox, {from: 0.999999, to: 0.0, duration: 0.5, 
							afterFinish: function() { 
								obj.lightbox.setOpacity(''); 
							}});		
	},
	
	top: function(y)
	{
		var cur = parseInt(this.lightbox.getStyle('top'),10);
		if (!y) return cur;
		
		this.lightbox.setStyle({top: (cur + y) + 'px'});
		return (cur + y);
	}
});

app.refine = Class.create({
	
	initialize: function()
	{
		this.jar = new CookieJar({
			expires: '', 
			path: '/'
		});
	},
	
	select: function(page, block, slug, sortBy, order, reload)
	{				
		var refine = this.jar.get('refine') || {};
		if (!refine[page]) refine[page] = {};
		refine[page][block] = slug;
		refine[page]['sort_by'] = sortBy;
		refine[page]['order'] = order;
		this.jar.put('refine', refine);
		
		var browser_type=navigator.appName;
		var browser_version=parseInt(navigator.appVersion);
		
		if (typeof(reload) == "undefined") {
			if (browser_type=="Microsoft Internet Explorer"&&browser_version==6)
				window.location.replace(window.location.href);
			//if IE 7
			else if (browser_type=="Microsoft Internet Explorer"&&browser_version==7)
				window.location.replace(window.location.href);
			//Default goto page (NOT IE 6 and NOT IE 7)
			else
				window.location.href = window.location.href;
		}	
	}
});

app.search = Class.create({
	
	initialize: function()
	{
		this.jar = new CookieJar({
			expires: '', 
			path: '/'
		});
	},
	
	select: function(page, search_type, search_keyword)
	{						
		var search = this.jar.get('search') ||{};
		if (!search['search']) search['search'] = {};
		search['search']['search_type'] = search_type;
		search['search']['search_keyword'] = search_keyword;
		this.jar.put('search', search);	
		
		window.refine.select(page,'search','all', 'updated_at','', 'defined');
		
		return true;					
	}
});

app.left_panel_product = Class.create({
	
	initialize: function()
	{
		this.jar = new CookieJar({
			expires: '', 
			path: '/'
		});
	},
	
	select: function(left_panel,sel_keyword)
	{						
		var product_updates = this.jar.get(left_panel) ||{};
		if (!product_updates[left_panel]) product_updates[left_panel] = {};
		product_updates[left_panel]['sel_keyword'] = sel_keyword;
		this.jar.put(left_panel, product_updates);	
		//window.location.reload();
		sugarsnap.update_left_panel_tracked_product();
		//return true;					
	},
	get:function(left_panel)
	{
		var product_updatessearch = this.jar.get(left_panel) ||{};
		return product_updates[left_panel]['sel_keyword'];
	}
});


var Cookie =
{
	set: function(name, value, daysToExpire)
	{
		var expire = '';
		if (daysToExpire != undefined)
		{
			var d = new Date();
			d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
			expire = '; expires=' + d.toGMTString();
		}
		return (document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + expire + '; path=/');
	},
	
	get: function(name)
	{
		var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + encodeURIComponent(name) + '=([^;\\s]*)'));
		return (cookie ? decodeURI(cookie[2]) : null);
	},
	
	erase: function(name)
	{
		var cookie = Cookie.get(name) || true;
		Cookie.set(name, '', -1);
		return cookie;
	},
	
	accept: function()
	{
		if (typeof navigator.cookieEnabled == 'boolean')
		{
			return navigator.cookieEnabled;
		}
		Cookie.set('_test', '1');
		return (Cookie.erase('_test') === '1');
	}
};

/**
 * Javascript code to store data as JSON strings in cookies. 
 * It uses prototype.js 1.5.1 (http://www.prototypejs.org)
 * 
 * Author : Lalit Patel
 * Website: http://www.lalit.org/lab/jsoncookies
 * License: Creative Commons Attribution-ShareAlike 2.5
 *          http://creativecommons.org/licenses/by-sa/2.5/
 * Version: 0.4
 * Updated: Aug 11, 2007 10:09am
 * 
 * Chnage Log:
 *   v 0.4
 *   -  Removed a extra comma in options (was breaking in IE and Opera). (Thanks Jason)
 *   -  Removed the parameter name from the initialize function
 *   -  Changed the way expires date was being calculated. (Thanks David)
 *   v 0.3
 *   -  Removed dependancy on json.js (http://www.json.org/json.js)
 *   -  empty() function only deletes the cookies set by CookieJar
 */

var CookieJar = Class.create();

CookieJar.prototype = {

	/**
	 * Append before all cookie names to differntiate them.
	 */
	appendString: "__CJ_",

	/**
	 * Initializes the cookie jar with the options.
	 */
	initialize: function(options) {
		this.options = {
			expires: 3600,		// seconds (1 hr)
			path: '',			// cookie path
			domain: '',			// cookie domain
			secure: ''			// secure ?
		};
		Object.extend(this.options, options || {});

		if (this.options.expires != '') {
			var date = new Date();
			date = new Date(date.getTime() + (this.options.expires * 1000));
			this.options.expires = '; expires=' + date.toGMTString();
		}
		if (this.options.path != '') {
			this.options.path = '; path=' + escape(this.options.path);
		}
		if (this.options.domain != '') {
			this.options.domain = '; domain=' + escape(this.options.domain);
		}
		if (this.options.secure == 'secure') {
			this.options.secure = '; secure';
		} else {
			this.options.secure = '';
		}
	},

	/**
	 * Adds a name values pair.
	 */
	put: function(name, value) {
		name = this.appendString + name;
		cookie = this.options;
		var type = typeof value;
		switch(type) {
		  case 'undefined':
		  case 'function' :
		  case 'unknown'  : return false;
		  case 'boolean'  : 
		  case 'string'   : 
		  case 'number'   : value = String(value.toString());
		}
		var cookie_str = name + "=" + escape(Object.toJSON(value));
		try {
			document.cookie = cookie_str + cookie.expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Removes a particular cookie (name value pair) form the Cookie Jar.
	 */
	remove: function(name) {
		name = this.appendString + name;
		cookie = this.options;
		try {
			var date = new Date();
			date.setTime(date.getTime() - (3600 * 1000));
			var expires = '; expires=' + date.toGMTString();
			document.cookie = name + "=" + expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Return a particular cookie by name;
	 */
	get: function(name) {
		name = this.appendString + name;
		var cookies = document.cookie.match(name + '=(.*?)(;|$)');
		if (cookies) {
			return (unescape(cookies[1])).evalJSON();
		} else {
			return null;
		}
	},

	/**
	 * Empties the Cookie Jar. Deletes all the cookies.
	 */
	empty: function() {
		keys = this.getKeys();
		size = keys.size();
		for(i=0; i<size; i++) {
			this.remove(keys[i]);
		}
	},

	/**
	 * Returns all cookies as a single object
	 */
	getPack: function() {
		pack = {};
		keys = this.getKeys();

		size = keys.size();
		for(i=0; i<size; i++) {
			pack[keys[i]] = this.get(keys[i]);
		}
		return pack;
	},

	/**
	 * Returns all keys.
	 */
	getKeys: function() {
		keys = $A();
		keyRe= /[^=; ]+(?=\=)/g;
		str  = document.cookie;
		CJRe = new RegExp("^" + this.appendString);
		while((match = keyRe.exec(str)) != undefined) {
			if (CJRe.test(match[0].strip())) {
				keys.push(match[0].strip().gsub("^" + this.appendString,""));
			}
		}
		return keys;
	}
};

// FOR AJAX TIMEOUT

function callInProgress (xmlhttp)
{
	switch (xmlhttp.readyState)
	{
		case 1: case 2: case 3:
			return true;
			break;
		// Case 4 and 0
		default:
			return false;
			break;
	}
}

var allowErrorAlerts = true;

function showFailureMessage()
{
	if (allowErrorAlerts)
	{
		allowErrorAlerts = false;
		alert(app.strings.err_timeout);
		allowErrorAlerts = true;
	}
}

function showFatalMessage(e)
{
	if (allowErrorAlerts)
	{
		allowErrorAlerts = false;
		alert(app.strings.err_fatal+(app.debug ? '\n\n'+e.message : ''));
		allowErrorAlerts = true;
	}
}

// Register global responders that will occur on all AJAX requests

Ajax.Responders.register({
	onCreate: function(request)
	{
		if (request.options['maxExecutionTime'] !== false)
		{
			request['timeoutId'] = window.setTimeout(
				function()
				{
					// If we have hit the timeout and the AJAX request is active, abort it and let the user know
					if (callInProgress(request.transport))
					{
						request.transport.abort();
						if (request.url.indexOf('quiet=1') == -1)					
							showFailureMessage();
						// Run the onFailure method if we set one up when creating the AJAX object
						if (request.options['onFailure'])
						{
							request.options['onFailure'](request.transport, request.json);
						}
					}
				},
				request.options['maxExecutionTime'] || 30000 // 30 seconds
			);			
		}
	},
	onComplete: function(request)
	{		
		// Clear the timeout, the request completed ok
		window.clearTimeout(request['timeoutId']);
	},
	onException: function(request, e)
	{
		// Clear the timeout
		window.clearTimeout(request['timeoutId']);
		request.transport.abort();
		
		if (e.name == "NS_ERROR_NOT_AVAILABLE")
		{
			return false;
		}
		showFatalMessage(e);
	}
});

function popWindow(event,x,width,height,title)
{	
	Event.stop(event);
	
	if (!title) title = 'togoPop';
	args = "width=" + (width) + "," 
	+ "height=" + (height) + "," 
	+ "location=0," 
	+ "menubar=0,"
	+ "resizable=1,"
	+ "scrollbars=1,"
	+ "status=1," 
	+ "titlebar=0,"
	+ "toolbar=0,"
	+ "hotkeys=0";
	window.open(x.href,title,args);
}

function loginBox(loginform)
{
	loginform.username.onfocus=function() {};
	loginform.password.onfocus=function() {};
	loginform.username.value = "";
	loginform.username.style.color="#2e2a30";
	
	var size = loginform.password.size;
	var input = document.createElement('input');
	input.type='password';
	input.name='password';
	input.size=size;
	input.value='';
	input.style.color="#2e2a30";
	
	loginform.password.parentNode.replaceChild(input, loginform.password);
}

// DISABLE DELETE = BACK IN BROWSER

function __disableBackspace(event)
{
	var keycode = event.charCode ? event.charCode : event.keyCode;

	if (keycode && (keycode == 8) && !(Event.element(event) && Event.element(event).value))
		Event.stop(event);
}

Event.observe(document, 'keydown', __disableBackspace.bindAsEventListener(this));
Event.observe(document, 'keypress', __disableBackspace.bindAsEventListener(this));

// OS DETECT

window.win = ( navigator.appVersion.indexOf( 'Win' ) != -1 );
window.mac = ( navigator.appVersion.indexOf( 'Mac' ) != -1 );
window.lin = ( navigator.userAgent.indexOf( 'Linux' ) != -1 );

// REFINE

window.refine = new app.refine();

// SEARCH

window.search = new app.search();

window.left_panel = new app.left_panel_product();

// ENABLE BACKGROUND IMAGE CACHE

if (Prototype.Browser.IE6) try {document.execCommand("BackgroundImageCache", false, true);} catch (e){}; 

// CLIENT TIMEZONE
var TZ = new Date().getTimezoneOffset();





var star_rating = {
		fill_on_mouseover: function(star_id){
			var prepend_to_id = "rating_";
			for(i=1;i <= 5;i++)
			{
				if (i <= star_id){
					$(prepend_to_id + i).src = star_rating.filled_star_html();
					star_rating.display_text_by_message(i);
				}else{
					$(prepend_to_id + i).src = star_rating.blank_star_html();
				}
			}
		},
		restore_on_mouseout: function(star_id){
			star_rating.fill_on_mouseover($('ratings').value);
			star_rating.display_text_by_message($('ratings').value);
		},
		filled_star_html: function(){
				return ("/img/leftcol/startfilled_white.gif");

		},
		blank_star_html: function(){

				return ("/img/leftcol/starblank_white.gif");
		
		},
		set_rating: function(star_id){
				$('ratings').value = star_id;
				
		},
		display_text_by_message: function(star_value){
				str = "&nbsp;";
				switch(star_value){
						case 1 :
						case "1" :
								str = "Very Poor (Critical Review)";
								break;
						case 2 :
						case "2" :
								str = "Poor (Critical Review) ";
								break;
						case 3 :
						case "3" :
								str = "Average (Critical Review)";
								break;
						case 4 :
						case "4" :
								str = "Good (Favorable Review)";
								break;
						case 5 :
						case "5" :
								str = "Excellent (Favorable Review)";
								break;
				}
				
			star_rating.update_message_in_div(str);
		},
		update_message_in_div: function(msg){
			$('rating_text').update(msg);
		}
};
	//starblank_white.gif
	//startfilled_white