
/****************************************************************************************************************************
 *
 * Size resize on window size, buttons and browse login dropdowns  -- move all this to sella_modiules, use $s not $
 *
 ****************************************************************************************************************************/
 
 //jQuery.event.add(window, "load", resizeFrame);
jQuery.event.add(window, "resize", resizeFrame);

function resizeFrame() 
{
    var w = $(window).width();
	
	if(w > 1030){
		$("div.size-changer").addClass("full-width");
		$("div.size-changer").removeClass("small-width");
	}
	
	if(w < 1030){
		$("div.size-changer").addClass("small-width");
		$("div.size-changer").removeClass("full-width");
	}
	

}


 $(document).ready(function(){	 	
	
	$("span.drop-toggle").click(function(){
		if ($("div#drop-browse").is(':hidden'))
			$("div#drop-browse").show();
		else{
			$("div#drop-browse").hide();
		}
	$("div#login-top").hide();
	return false;
	});
	
	$("span#close-button").click(function(){
		$("div#drop-browse").hide();
	});
	
	$('div#drop-browse').click(function(e) {
		e.stopPropagation();
	});
	
	$(document).click(function() {
		$('div#drop-browse').hide();
	});
	
	$("a#nav-login").click(function(){
		if ($("div#login-top").is(':hidden')){
			$("div#login-top").show();
			$('div#login-top input#top-email').focus();
		}else{
			$("div#login-top").hide();
		}
	$("div#drop-browse").hide();
	return false;
	});
	
	$('div#login-top').click(function(e) {
		e.stopPropagation();
	});
	
	$(document).click(function() {
		$('div#login-top').hide();
	});
	
	$("span#login-close").click(function() {
		$('div#login-top').hide();
	});
	
	$("a#change-region").click(function(){		
		if ($("div#regions-list").is(':hidden')){
			$("div#regions-list").show();			
		}else{
			$("div#regions-list").hide();
		}
	$("div#drop-browse").hide();
	return false;
	});
	
	$('div#regions-list').click(function(e) {
		e.stopPropagation();
	});
	
	$(document).click(function() {				
		$('div#regions-list').hide();
	});
	
	$("span#close-region").click(function() {
		$('div#regions-list').hide();
	});		

});

$(document).ready(function(){ 

	$("span#toggle-button").mouseover(function(){
										 
		$(this).addClass("hover");
		$("a#nav-browse").addClass("hover");
		
	});
	
	$("span#toggle-button").mouseout(function(){
										 
		$(this).removeClass("hover");
		$("a#nav-browse").removeClass("hover");
		
	});
	
	$("span#account-box-toggle").mouseover(function(){
										 
		$(this).addClass("hover");
		$("a#nav-account").addClass("hover");
		
	});
	
	$("span#account-box-toggle").mouseout(function(){
										 
		$(this).removeClass("hover");
		$("a#nav-account").removeClass("hover");
		
	});
	
	$("span#close-button").mouseover(function(){
										 
		$(this).addClass("hover");
		
	});
	
	$("span#close-button").mouseout(function(){
										 
		$(this).removeClass("hover");
		
	});

});


$(document).ready(function(){ 

	$("div.button-standard").mouseover(function(){
										 
		$(this).addClass("hover");
		
	});
	
	$("div.button-standard").mouseout(function(){
										 
		$(this).removeClass("hover");
		$(this).removeClass("click");
		
	});
	
	$("div.button-standard").mousedown(function(){
										 
		$(this).addClass("click");
		
	});
	
	$("div.button-standard").mouseup(function(){
										 
		$(this).removeClass("click");
		
	});
	
	$("div.button-grey-small").mouseover(function(){
										 
		$(this).addClass("hover");
		
	});
	
	$("div.button-grey-small").mouseout(function(){
										 
		$(this).removeClass("hover");
		$(this).removeClass("click");
		
	});
	
	$("div.button-grey-small").mousedown(function(){
										 
		$(this).addClass("click");
		
	});
	
	$("div.button-grey-small").mouseup(function(){
										 
		$(this).removeClass("click");
		
	});

});

$(function(){
	$('.mc-account-statement tr:nth-child(2n)').addClass('even');
	$('.money').each(function(){
		var contents = $(this).text();
		// remove everything but sign, numbers, dot & comma
		contents = contents.replace(new RegExp('[^-0-9.,]', 'g'), '');
		if (contents.length > 0) {
			contents = '<span>$</span>'+contents;
			$(this).html(contents);
		}
	});
});

$(function(){
	$('form.filters input#find').focus(function() {
		if ($(this).val() == 'Title or Ref') {
			$(this).val('').removeClass('find_field');
		}
	}).blur(function() {
		if ($(this).val() == '' || $(this).val() == 'Title or Ref') {
			$(this).addClass('find_field').val('Title or Ref');
		}
	}).blur();
	$('form.filters').submit(function(e) {
		if ($('form.filters input#find').val() == 'Title or Ref') {
			$('form.filters input#find').val('');
		}
	});
});

/****************************************************************************************************************************
 *
 * JQuery extensions
 *
 ****************************************************************************************************************************/
var $s = jQuery; // Alias jQuery - can be remapped to a new library easier if required

Number.prototype.pad = function (n, p) {
	var s = '' + this;
	p = p || '0';
	while (s.length < n) {
		s = p + s;
	}
	return s;
};

String.prototype.encodeHtml = function() 
{ 
	return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); 
};

String.prototype.decodeHtml = function() 
{
	return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>'); 
};

/****************************************************************************************************************************
 *
 * Sella Framework
 *
 ****************************************************************************************************************************/
var sella = {};

	sella.trim = function(str, chars) {
		return sella.ltrim(sella.rtrim(str, chars), chars);
	};

	sella.ltrim = function(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
	};

	sella.rtrim = function(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
	};

	sella.get_by_id = function(id){//backward compatible method
		return $s('#'+id).get(0);
	};

	sella.get = function(selector){
		return $s(selector).get(0);
	};

	sella.get_all = function(selector){
		return $s(selector).get();
	};

	sella.show = function(selector){
		return $s(selector).css({'display':'block'});
	};

	sella.hide = function(selector){
		return $s(selector).css({'display':'none'});
	};

	sella.enable = function(selector){
		return $s(selector).attr( 'disabled', false ).removeClass('disabled').parent().removeClass('disabled');
	};

	sella.disable = function(selector){
		return $s(selector).attr( 'disabled', true).addClass('disabled').parent().addClass('disabled');
	};

	sella.enable_button = function(selector){
		return $s(selector).attr( 'disabled', false ).parent().removeClass('button-disabled');
	};

	sella.disable_button = function(selector){
		return $s(selector).attr( 'disabled', true).parent().addClass('button-disabled');
	};


	sella.hide_on_checked = function(selector, affected){
		if($s(selector).attr('checked') == true){
			sella.hide(affected);
		}else{
			sella.show(affected);
		}
	};

	sella.show_on_checked = function(selector, affected){
		if($s(selector).attr('checked') == true){
			sella.show(affected);
		}else{
			sella.hide(affected);
		}
	};

	sella.hide_on_value = function(selector, value, affected){
		if($s(selector) && $s(selector).val() == value){
			sella.hide(affected);
		}else{
			sella.show(affected);
		}
	};

	sella.show_on_value = function(selector, value, affected){
		if($s(selector).val() == value){
			sella.show(affected);
		}else{
			sella.hide(affected);
		}
	};

	sella.checked_toggle = function(selector, affected){
		if($s(selector).attr('checked') == true){
			sella.enable(affected);
		}else{
			sella.disable(affected);
		}
	};


	sella.html = function(selector, content){
		return $s(selector).html(content);
	};
	sella.text = function(selector, content){
		return $s(selector).text(content);
	};
	sella.value = function(selector, value){
		return $s(selector).val(value);
	};

	sella.add_class = function(selector, classname){
		return $s(selector).addClass(classname);
	};

	sella.remove_class = function(selector, classname){
		return $s(selector).removeClass(classname);
	};

	sella.display = function(selector, value){
		return $s(selector).css("display",value);
	};

	sella.set_attr = function(selector, attr, value){
		return $s(selector).attr(attr,value);
	};

	sella.css = function(selector, name, value){
		return $s(selector).css(name,value);
	};

	sella.handle_checked = function(selector, func, toggle){
		if($s(selector).attr('checked') == true ){
			func();
		}else if(typeof toggle != 'undefined'){
			func();
		}
		return $s(selector).bind("click", func);
	};

	sella.handle_value = function(selector, value, func, toggle){
		if($s(selector).val() == value ){
			func();
		}else if(typeof toggle != 'undefined'){
			func();
		}
		return $s(selector).bind("change", func);
	};

	sella.handle_change = function(selector, func){
		func();
		return $s(selector).bind("change", func);
	};

	//bit of sugar
	sella.onclick_toggle = function( trigger, affected){
		sella.onclick(trigger, function(){ sella.checked_toggle(trigger, affected) });
	}

	sella.onclick = function(selector,func, fn){
		return $s(selector).bind("click", func, fn);
	};

	sella.onchange = function(selector,func,fn){
		return $s(selector).bind("change", func, fn);
	};

	sella.onmouseover = function(selector,func, fn){
		return $s(selector).bind("mouseover", func, fn);
	};

	sella.onmouseout = function(selector,func, fn){
		return $s(selector).bind("mouseout", func, fn);
	};

	sella.onfocus = function(selector,func, fn){
		return $s(selector).bind("focus", func, fn);
	};

	sella.onblur = function(selector,func, fn){
		return $s(selector).bind("blur", func, fn);
	};

	sella.onkeyup= function(selector,func, fn){
		return $s(selector).bind("keyup", func, fn);
	};

	sella.onsubmit= function(selector,func, fn){
		return $s(selector).bind("submit", func, fn);
	};

	sella.unbind = function(selector,event,func){
		return $s(selector).unbind(event, func);
	};
	
	sella.trigger = function(selector,event){
		return $s(selector).trigger(event);
	};
	
	sella.eval_json = function(json){
		return $s.evalJSON(json);
	};

	sella.to_json = function(string){
		return $s.toJSON(string);
	};

	sella.load = function(selector,url){
		$s.ajax({
			type:"GET",
			url: url,
			success: function(xhr){//better syntax possible?
				sella.html(selector, $s.evalJSON(xhr));
			}
		});
	};

	sella.load_as_html = function(url){
		return $.get(url,function(data){
		  return sella.eval_json(data);
		});

	};

	sella.rpc_url = function (service) {
		var url = '/services/rpc/'+encodeURIComponent(service);
		var parts = [];

		for (var i = 1; i < arguments.length; i++) {
			parts.push (encodeURIComponent(arguments[i]));
		}

		if (parts.length > 0) {
			url += '?' + parts.join('&');
		}
		return url;
	};

	sella.widget_url = function () {
		var url = '/services/widget.php';
		var parts = [];

		for (var i = 0; i < arguments.length; i++) {
			parts.push (encodeURIComponent(arguments[i]));
		}

		//var currentTime = new Date();//to avoid caching issues
		//append +'&uid='+currentTime.getTime()

		if (parts.length > 0) {
			url += '?' + parts.join('&');
		}
		return url;
	};

	sella.set_five_minute_cookie = function (name, value, path)
	{
		if(typeof path == 'undefined') {
			path = '/';
		}
		var date = new Date();
        date.setTime(date.getTime() + (5 * 60 * 1000)); // 5 minutes
		$s.cookie(name, value, {expires:date, path: path});
	};

	/**
	 * Deprecated, use sella.rpc() instead
	 */
	sella.ajax = {};
	
		sella.ajax.get = function(url, success, args, error){
			if(typeof error == 'undefined') error = sella.ajax.handle_json_failure;
			return $s.ajax({
				type:"GET",
				url: url,
				success: function(xhr){
					var response = {responseText:xhr,argument:args};
					success(response);
				},
				error: function(xhr){
					var params = {args:args,url:url};
					error(xhr,params);
				}
				//args: args//TODO: this used?
			});
		};

		sella.ajax.handle_json_failure = function (response, params) {
			//params are intended to permit passing values to be reused on calling page once logged in.
			try {
				var error = $s.evalJSON(response.responseText);
				
				if (error.error === 'afro_exception_permission_denied' || error.error === 'permission_denied_exception') {
					//if(typeof params.args.type != 'undefined'){

						//if (params.args.type == 'bid'){
							//window.location = '/login/?referrer='+encodeURI(window.location)+'&action=place_bid&bid_listing_id='+params.args.listing_id+'&bid_auto_bid='+params.args.auto_bid+'&bid_price='+params.args.price;
						//}

					//}else{
						window.location = '/login/?referrer='+encodeURI(window.location);
					//}

				} else if (error.message.match(/not confirmed your email address/)) {

					window.location = '/my-sella/verification/verify/email/';

				} else {
				
					sella.feedback (error.message, 'error');

				}

			} catch (exception) {

				alert ("Sorry - there was an Internal server error");
			}

		};
		
	sella.ready = function(func){
		$s(func);
	};

	/**
	 * Returns true if a user is logged in
	 * 
	 * @return boolean 
	 */
	sella.is_authenticated = function()
	{
		if(sella_user_id) {
			return true;
		}
		return false;
	};
	
	sella.get_user_id = function()
	{
		return sella_user_id;
	};
	
	sella.get_listing_id = function()
	{
		return current_listing_id;
	};
	
	/**
	 * Safely calls a function passed as a string without using eval. If 'function_name' is actually of type 'function' 
	 * it simply calls it directly.
	 * 
	 * @param string function_name  The function to call.
	 * @param mixed  args....		The arugment to pass to the function.
	 */
	sella.call_user_func = function (function_name /*, args */)
	{
	    var args		= [];
	    
	    // Copy all other arguments we want to "pass through"
	    for(var i = 1; i < arguments.length; i++) {
	        args.push(arguments[i]);
	    }
		
	    if(typeof function_name == 'function') {
	    	return function_name.apply(window, args);
	    }
	    
	    // 'function_name' must be a string
	    var namespaces	= function_name.split(".");
	    var context		= window;
	    var func		= namespaces.pop();
	    
		for(var i = 0; i < namespaces.length; i++) {
			context = context[namespaces[i]];
		}
		
		if(typeof context[func] === 'function') {
			return context[func].apply(context, args);
		}
		return false;
	};

	sella.track = function(selector, name, item, uri){
		if(sella.get(selector)){
			sella.onclick(selector, function(e){
				if(typeof uri == 'undefined')  uri = window.location.pathname;
				pageTracker._trackEvent(name, item, uri);
			});
		}
		
	}
	
/****************************************************************************************************************************
 *
 * RPC
 * 
 ****************************************************************************************************************************/
	
	/**
	 * The standard way to call a Sella webservice. In most situations you'd need to provide the 'webservice', 'params' & 
	 * 'on_success' options, however only 'webservice' or 'rpc_url' is required. 
	 * 
	 * Should the webservice require authentication the default error handler takes care of redirecting to the login page, 
	 * then redirecting back after successful login, and finally re-trying the RPC call.
	 * 
	 * The 'on_success' callback signiture should look like: function(response, options); 'response' is the JSON decoded result
	 * of the RPC call, 'options' is the same options object passed to the inital sella.rpc() call.
	 * 
	 * Examples:
	 * 
	 * 
	 * sella.rpc({ webservice:   'area_lookup',
	 *             params:       [suburb_field.value, district_field.value],
	 *             on_success:   function (response, options) { if (response.suburb_id) { sella.location.set(response); }}});
	 * 
	 * Note: If you want the RPC call to be serializable all callback functions in 'options' should be written as strings. 
	 *       This is pertinent to RPC calls which require authentication since the options will need to be serialized while 
	 *       redirecting to the login page etc.
	 * 
	 * @param options -
	 *           string       'webservice'      The webservice to call.
	 *           string       'rpc_url'         The URL of the webservice to run, only needed if you don't specify a 'webservice'
	 *           array|object 'params'          Params to pass to the webservice.
	 *           func|string  'on_success'      On success callback function. Can be either a string or function. The XHRResponse 
	 *                                          & 'options' will be passed as parameters.
	 *           func|string  'on_failure'      On failure callback. Normally wont have to set this, the default will handle 
	 *                                          logins. The RPC responce & 'options' will be passed as parameters.
	 *           func|string  'pre_ajax'        Pre AJAX callback function.
	 *           boolean      'requires_login'  If true, and not logged in, redirect to login page without attempting RPC.
	 *           string       'redirect_url'    Where to redirect the user to after they've logged in, defaults to the current URL.
	 *           boolean      'async'			Make an async request, default true.
	 *           integer      'timeout'			Defaults to 30000 (30 seconds).

	 */
	sella.rpc = function (options)
	{
		// Default options
		var settings = {on_failure:      'sella.rpc.afro_exception_handler',
						redirect_url:    window.location.href,
						async:			true,
						timeout:		30000};
		
		// Merge the options with our defaults.
		$s.extend(settings, options);
		
		// Build the RPC url if they've supplied a webservice & params
		if(settings.webservice) {
			
			var url = '/services/rpc/'+encodeURIComponent(settings.webservice)+'?';
	
			$s.each(settings.params, function(name, value) {
				url += encodeURIComponent(value)+'&';
			});
			
			settings.rpc_url = url;
		}
		
		if(!settings.rpc_url) {
			alert('Error - undefined RPC action.');
			return false;
		}
		
		if(settings.requires_login && !sella.is_authenticated() ) {
			// We're not logged in, call the on_failure callback
			return sella.call_user_func(settings.on_failure, {error: 'permission_denied_exception'}, settings);
		}
		
		if(settings.pre_ajax) {
			sella.call_user_func(settings.pre_ajax, settings);
		}

		var ajax_params = {type:		'GET',
						url:		settings.rpc_url,
						timeout:	settings.timeout, // 30 seconds
						success:	function(xhr) { sella.rpc.success_handler(xhr, settings); },
						error:		function(xhr, status) { sella.rpc.error_handler(xhr, status, settings); } };

		if(!settings.async) {
			ajax_params.async = false;
			return sella.eval_json($s.ajax(ajax_params).responseText);//directly returns - no callback

		}
		// Make the AJAX request
		return $s.ajax(ajax_params);
	};
	
	/**
	 * Runs straight after an RPC success, does any tidy up and then calls the on_success function from options.
	 */
	sella.rpc.success_handler = function(response, options)
	{
		response = sella.eval_json(response);
		// Run the suppiled on_success function
		if(options.on_success) { 
			sella.call_user_func(options.on_success, response, options);
		}
	};
	
	/**
	 * Runs straight after an RPC failure, does any tidy up and then calls the on_failure function from options. 
	 */
	sella.rpc.error_handler = function(response, status, options)
	{
		if(status == 'timeout') {
			alert('Error: Couldn\'t contact sella.co.nz - You might be having connection problems. Please try again.');
			return;
		}
		response = sella.eval_json(response.responseText);
		
		// Run the suppiled on_failure function
		if(options.on_failure) {
			sella.call_user_func(options.on_failure, response, options);
		}
	};
	
	/**
	 * The default error handler for RPC calls. Takes care of redirecting to the login page
	 * and then redirecting to 'redirect_url' after login.
	 */
	sella.rpc.afro_exception_handler = function(error, options)
	{
		if (error.error === 'afro_exception_permission_denied' || error.error === 'permission_denied_exception') {
			// Save this RPC call for later and redirect to the login page
			options.is_pending = true;
			options.requires_login = true;
			sella.state.set('pending_rpc', sella.to_json(options), 5*60);
			window.location = '/login/?referrer='+encodeURI(options.redirect_url);
		}else if(error.error === 'afro_exception_redirect'){
			//console.log(error);
			window.location = error.url
		}else if (error.message.match(/not confirmed your email address/)) {
			console.log(error);
			//window.location = '/my-sella/verification/verify/email/?referrer='+encodeURI(options.redirect_url);
		} else {
			// Close any open dialog windows.
			sella.widget.cancel();
			sella.feedback(error.message, 'error');
		}
	};
	
	/**
	 * Return true if there are pending actions
	 */
	sella.rpc.exists_pending_actions = function()
	{
		return sella.state.get('pending_rpc');
	};
	
	/**
	 * Check for any pending RPC calls for the current URL and run them.
	 */
	sella.rpc.execute_pending = function()
	{
		var pending_rpc = sella.state.get('pending_rpc');
		
		if(!pending_rpc) {
			// Nothing pending
			return;
		}
		var options = $s.evalJSON(pending_rpc);
		
		// We only want to run the RPC call if we're on the correct URL.
		if(options && options.redirect_url == window.location.href) {
			
			// This is to catch the situation of someone using the back button to 
			// return to the calling page without actually logging in. 
			if(!sella.is_authenticated() && options.requires_login) {
				return;
			}
			
			sella.state.set('pending_rpc', '');
			
			// Update ther user_id RPC parameter incase we've just logged in
			if('user_id' in options.params) {
				options.params.user_id = sella.get_user_id();
			}
			sella.rpc(options);
		}
	};

/****************************************************************************************************************************
 * 
 * Widget
 * 
 ****************************************************************************************************************************/
	
	/**
	 * Wrapper of sella.rpc() which uses the widget service URL.
	 * 
	 * @see sella.rpc
	 * 
	 * @param string options.title The title of the widget box
	 * @param string options.width The width of the widget box
	 */
	sella.widget = function (options)
	{
		// Default options
		var settings = {on_success: 'sella.widget.default_success_handler', 
						pre_ajax:	'sella.widget.default_pre_ajax',
						title:		'',
						width:		530,
						height:		'auto'};
		
		// Merge the options with our defaults.
		$s.extend(settings, options);
		
		var rpc_url = '/services/widget.php?';	
		$s.each(settings.params, function(name, value) {
			rpc_url += encodeURIComponent(value)+'&';
		});
		settings.rpc_url = rpc_url;
		
		return sella.rpc(settings);
	};
	
	/**
	 * Run before the AJAX call for widgets.
	 * 
	 * Creates the dialog and uses options.title as the title.
	 */
	sella.widget.default_pre_ajax = function(options)
	{
		// Create the dialog
		if($s('#sella_dialog').size() == 0) {
			$s(document.body).append('<div id="sella_dialog"></div>');
		}
		
		$s('#sella_dialog').addClass('loading-indicator').html('<h4 style="height:400px">Loading...</h4>');
		$s('#sella_dialog').dialog({ bgiframe: 		true
								, width:			options.width
								, height:			options.height
								, title: 			options.title
								, resizable:		false
								, closeOnEscape:	true
								, modal:			true
								, close:			sella.widget.cancel}).dialog('open');
		
		// Allows a click on modal underlay to close the widget
		$s(document).unbind($s.ui.dialog.overlay.events);
		$s('.ui-widget-overlay').click(sella.widget.cancel);
	};
	
	/**
	 * Displays the loaded widget
	 */
	sella.widget.default_success_handler = function(response, options)
	{
		$s('#sella_dialog').removeClass('loading-indicator');
		$s('#sella_dialog').html(response);
		
		$s('#sella_dialog').dialog({
			bgiframe:		true,
			width:			options.width,
			height:			options.height,
			resizable:		false,
			closeOnEscape:	true,
			modal:			true,
			close:			sella.widget.cancel
		}).dialog('open');
	};
	
	/**
	 * Close the widget
	 */
	sella.widget.cancel = function()
	{
		$s('#sella_dialog').dialog("destroy");
		$s('#sella_dialog').remove();
		return false;
	};
	
/****************************************************************************************************************************
 * 
 * State
 * 
 * Encapsulation of storing state across page-loads. Currently stored in cookies but could be changed to store server-side 
 * or on mars in the future.
 ****************************************************************************************************************************/
	sella.state = {
		cookie_prefix: 'sella.state.'	
	};
	
	sella.state.set = function(name, value, timeout) 
	{
		var options = { path: '/' };
		
		if(typeof timeout != 'undefined') {
			var date = new Date();
			date.setTime(date.getTime() + (timeout * 1000));
			options.date = date;
		}
		return $s.cookie(sella.state.cookie_prefix+name, value, options);
	};
	
	sella.state.get = function(name) 
	{
		return $s.cookie(sella.state.cookie_prefix+name);
	};


	//server side version
	sella.session_state ={
	};

	sella.session_state.set = function(name, value)
	{
		sella.rpc({ webservice:   'session_state_set',
					params:       {name:name, value:value}});
	};

	sella.session_state.get = function(name,handler)
	{
		sella.rpc({ webservice:   'session_state_get',
	              params:       {name:name},
	              on_success:	handler});
	};

	sella.session_state.get_sync = function(name)
	{
		sella.rpc({ webservice:   'session_state_get',
	              params:       {name:name},
	              async:		false,
				  timeout:		3000});//3 seconds max
	};
	
/****************************************************************************************************************************
 *
 * Sella Helpers
 *
 ****************************************************************************************************************************/

sella.helpers = {};

	sella.helpers.removeInvalidChars = function(value, type) {
		/* try:
		 *		numeric		 (0-9)
		 *		decimal		 (0-9.)
		 *		alpha		 (a-z)
		 *		alphanumeric (0-9a-z)
		 */
		var validChars = ''; // chars compatible with regex
		if (type.indexOf('num') != -1) validChars += '0-9';
		if (type.indexOf('decimal') != -1) validChars += '0-9\.';
		if (type.indexOf('alpha') != -1) validChars += 'a-z';
		var regex = new RegExp('[^'+validChars+']', 'gi');
		return value.replace(regex, '');
	};

	sella.helpers.formatDecimal = function(value) {
		return value;
		value = sella.helpers.removeInvalidChars(value, 'decimal');
		var parts = value.split('.');
		if (parts.length == 1) parts[1] = '';
		parts[1] += '00';
		parts[1] = parts[1].substr(0, 2);
		if (parts[1] == '00') parts.pop();
		return parts.join('.');
	};

	sella.helpers.hasFlashVersion = function(requiredMajorVersion, requiredMinorVersion, requiredRevision) {
		$s.include('/javascript/FlashPlayerDetectionKit-V1.5/AC_OETags.js', true);
		return DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
	};

	sella.helpers.browser_is_ie6 = function() {
		return ((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined));
	};

/****************************************************************************************************************************
 *
 * Sella Widgets
 *
 ****************************************************************************************************************************/
sella.highlight_note = function (e) {
	$s(e.target).next('span.note-active').addClass('attention');
};
sella.lowlight_note = function (e) { 
	$s(e.target).next('span.note-active').removeClass('attention');
};


sella.rollover = function (e) {//assumes a vertical 25px position shift in sprite
	$s(e.target).css('background-position','0px -25px');

};

sella.rollback = function (e) {//assumes a vertical 25px position shift in sprite
	$s(e.target).css('background-position','0px 0px');

};

/**
 * Turns a link (anchor) into an ajax loding indicator
 * 
 *  @param string selector
 */
sella.show_link_indicator = function(selector)
{
	$s(selector).addClass('loading');
	// Maintain the existing link width
	var target_width = $(selector).innerWidth();
	$s(selector).html('Saving...');
	
	$(selector).css({ 'margin-right': (target_width-$(selector).innerWidth()-4)+'px' });//TODO cleanup $s vs $
};

sella.hideAlert = function () {
	$s("#feedback-alert-element").slideUp("fast");
	return false;
};

sella.showAccountBar = function() {
	$s("#account-bar-wrapper").slideDown("normal");
	$s("#account-bar").slideDown("normal");
	$s("#account-box-toggle").removeClass('open').addClass('close');
	$s("#account-box-toggle").one("click",sella.hideAccountBar);
	$s.cookie('accountbar', 'show', {path:'/'});
};

sella.hideAccountBar = function() {
	$s("#account-bar-wrapper").slideUp("fast");
	$s("#account-bar").slideUp("fast");
	$s("#account-box-toggle").addClass('open').removeClass('close');
	$s("#account-box-toggle").one("click",sella.showAccountBar);
	$s.cookie('accountbar', 'hide', {path:'/'});
};

sella.showBrowseBar = function() {
        $s("#browse-bar").click(function(e) {  e.stopPropagation(); });
        var eLeft = ($('#nav-browse').offset().left);
        var eTop = ($('#container').offset().top);
        $s("#browse-bar").css('top',eTop + 'px').css('left', eLeft + 'px');
	$s("#browse-bar").show();
	$s("#browse-bar-toggle").removeClass('open').addClass('close');
	$s("#browse-bar-toggle").one("click",sella.hideBrowseBar);
        $(document).click(sella.hideBrowseBar);
};

sella.hideBrowseBar = function(e) {
    if(e.button != 2) {
	$s("#browse-bar").hide();
	$s("#browse-bar-toggle").addClass('open').removeClass('close');
	$s("#browse-bar-toggle").one("click",sella.showBrowseBar);        
        $(document).unbind('click', sella.hideBrowseBar);
    }
};

sella.feedback = function (message, message_class) {
	var div_id = 'feedback-alert-element';
	var div = document.getElementById (div_id);

	if (!message_class) {
		message_class = 'global-note';
	}

	if (div) {
		/*div.appendChild(document.createElement('br'));*/
		while (div.hasChildNodes()) {
			div.removeChild(div.firstChild);
		}

	} else {
		var content = document.getElementById ('content_feedback');
		div = document.createElement ('div');
		div.setAttribute('id', div_id);
		content.appendChild(div);
	}

	div.setAttribute('class', message_class);
	div.setAttribute('className', message_class);


	var messages = message.split("\n");

	if (messages.length > 1) {
		var ol = document.createElement('ol');
		div.appendChild(ol);

		for (var i = 0; i < messages.length; i++) {
			var li = document.createElement('li');
			li.innerHTML = messages[i];
			ol.appendChild(li);
		}

	} else {
		var span = document.createElement('span');
		span.innerHTML = message;
		div.appendChild(span);
	}

	window.location.hash = 'top';
};

sella.tooltip = function(selector, content, url) {//don't need url unless we want custom loaded ajax tooltip panels
	if(typeof selector === 'undefined') selector = 'a[title]';
	if(!$s(selector).length) return false;

	if(typeof content === 'undefined' || content == ''){
		content = false;//default to title attribute
	}
	if(typeof url !== 'undefined' && content == ''){
		content = true;//fetch some content with an ajax call using the url or some other input
	}


   $s(selector).tooltip({
        tip: content,

		// place tooltip on the right edge
		position: ['bottom', 'center'],

		// a little tweaking of the position
		offset: [10, -20],

		// use a simple show/hide effect
		effect: 'toggle',

		relative: true,

		// custom opacity setting
		opacity: 0.8
   });
	return true;
};


sella.modal_dialog = function(selector) {
	if(typeof selector === 'undefined') selector = '#modal_dialog';
	if(!$s(selector).length) return false;

	$s(selector).dialog({
		bgiframe: true,
		height: 200,
		modal: true
	}).dialog('open');

	return true;
};

sella.dialog = function(selector) {
	if(typeof selector === 'undefined') selector = '#dialog';
	if(!$s(selector).length) return false;

	$s(selector).dialog({
		dialogClass: 'sella-alert-dialog',
		bgiframe: true,
		height: 150,
		modal: false
	}).dialog('open');

	return true;
};

sella.lightbox = function(listing_id, img_id, selector) 
{
	if(total_num_images == 1) {
		var width = 665;
		var height = 735;
	} else {
		var width = 880;
		var height = 675;
	}

	if(total_num_images > 1) {
		var title = '<div id="lightbox-controls"><img src="/images/button-standard-prev.gif" id="lb-prev" onclick="sella.lightbox_control(this)" /><p>Image <span id="lb-current">1</span> of <span id="lb-total">'+total_num_images+'</span></p><img src="/images/button-standard-next.gif" id="lb-next" onclick="sella.lightbox_control(this)" /></div>';
	}
	
	sella.lightbox.bind_keys();
    
	//now get the content
	if(listing_id) {
		sella.widget({title:	title,
					  width:	width,
					  height:	height,
					  params:	{ widget:		'lightbox', 
								  method:		'sella_widget_lightbox', 
								  listing_id: listing_id, 
								  img_id:		img_id}});
	}

	return true;
};

sella.lightbox.bind_keys = function ()
{
	if(sella.lightbox.is_keys_bound) {
		return;
	}
	/* navigation via arrow keyboard */
    $s(document).bind("keydown", function(e){
        switch(e.keyCode) {
            case 37: sella.lightbox_control('lb-prev'); break;
            case 38:
                if(total_num_images < 8){
                    sella.lightbox_control('lb-prev'); break;
                }else{
                    sella.lightbox_control('lb-up'); break;
                }
            case 39: sella.lightbox_control('lb-next'); break;
            case 40:
                if(total_num_images < 8){
                    sella.lightbox_control('lb-prev'); break;
                }else{
                    sella.lightbox_control('lb-down'); break;
                }
        }
    });
    sella.lightbox.is_keys_bound = true;
};

sella.lightbox_control = function(img)
{
    if((img == 'lb-prev')||(img == 'lb-next')||(img == 'lb-up')||(img == 'lb-down')) { 
    	// function called by keypress
        var direction = img.substr(3);
    } else { 
    	// function called by click on arrows
        var direction = img.id.substr(3);//strip off the prefix lb-prev lb-next
    }
    
	var length = $s('#lightbox-img-thumbs span').length;
	var current  = $s('#lightbox-img-thumbs img.highlight').parent('span').attr('id').substr(8);
	current = current *1;//force int
	var selected =  0;
	if(direction =='prev') {
		if(current == '0') {
			selected = length - 1;
		} else {
			selected = current - 1;
		}
	}
	else if(direction =='next') {
		if(current == length - 1){
			selected = 0;
		} else {
			selected = current + 1;
		}
	}
	else if(direction =='up') {
		if(current == '0') {
			selected = length - 2;
		}
		else if(current == '1') {
			selected = length - 1;
		} else {
			selected = current - 2;
		}
	} 
	else if(direction =='down') {
		if(current == length - 2) {
			selected = 0;
		}
		else if(current == length - 1) {
			selected = 1;
		} else {
			selected = current + 2;
		}
	}
	
	var img = sella.get('#lb-span-'+selected+' img');
	sella.lightbox_refresh(img);
};

sella.lightbox_refresh = function(img){
	var id = img.id.substr(9);//strip off the prefix

	var path = sella.lightbox_url(id);
	$s('#lightbox-img-main').attr('src',path.main);
	$s('#lightbox-img-main').attr('alt',img.alt);
	$s('#lightbox-caption-main').html(img.alt.encodeHtml());

	$s('#lightbox-img-thumbs img').attr("class" , "lowlight");//turn off highlight on old thumbnail
	$s('#'+img.id).attr("class" , "highlight");//add highlight on current thumbnail
	var current  = $s('#lightbox-img-thumbs img.highlight').parent('span').attr('id').substr(8);
	current = current *1;//force int
	$s('#lb-current').text(current + 1);
};

sella.lightbox_url = function(id) {
	//needs to know about global sella_assets for load balancing
	var assets = '';
	if(typeof sella_assets !== 'undefined') assets = sella_assets;

	var path = {};
	var suffix = id.slice(-3);
	var subpath = assets+'/images/thumb/'+suffix.substr(0, 1)+'/'+suffix.substr(1, 1)+'/'+suffix.substr(2, 1)+'/'+id;
	path.main = subpath+'-640x500.jpg';
	path.thumbnail = subpath+'-90x68.jpg';
	return path;
};

sella.carousel = function(selector) {
	if(!$s(selector).length) return false;
	sella.show('#img-thumbs');
	var length = $s(selector+' ul li').length;

	$s(selector).jCarouselLite({
		beforeStart: function(){
			$s(selector+' ul li img').attr("class" , "lowlight");//turn off highlight on old thumbnail
		},
		afterEnd: function() {
			var new_li = arguments[0][1];
			var new_img = $s(new_li).children('img')[0];
			var current = $s(new_li).attr('class');
			setImg(new_img, current);
			$s(new_li).children('img').attr("class","highlight");
		},
        btnNext: "#st-prev",
        btnPrev: "#st-next",
		start:0//this doesn't work ,so we advance the button below
    });

	$s("#st-next").trigger('click');
};

sella.autocomplete = function(selector,url,parser) {
	if(!$s(selector).length) return false;

	return $s(selector).autocomplete(url, {
		minChars: 2,
		max: 10,
		autoFill: true,
		width:600,
		selectFirst: true,
		dataType: 'json', // this parameter is currently unused

		parse: function(data) {
			return parser(data);
		},
		formatItem: function(item) {
			return item.nice;
		}

	});

};

sella.datepicker = function(selector,fields){
	if(!$s(selector).length) return false;

	if(typeof fields == 'undefined'){
		$s(selector).datepicker({
			showOn:'button',
			buttonText: 'Choose a date',
			dateFormat: 'dd/mm/yy',
			onClose: function(date) {
				var c = new Date ();
				this.value = date+' '+c.getHours().pad(2) + ':' + c.getMinutes().pad(2);
			}
		});
	}else if(fields == '1'){
		$s(selector).datepicker({
			showOn:'button',
			buttonText: 'Choose a date',
			dateFormat: 'dd/mm/yy',
			onClose: function(date) {
				this.value = date;
			}
		});
	}else if(fields == 3){
		$s(selector+'_year').datepicker({
			showOn:'button',
			buttonText: 'Choose a date',
			dateFormat: 'dd/mm/yy',
			onClose: function(date) {
				var datearr = date.split('/');
				sella.value(selector+'_day', datearr[0]);
				sella.value(selector+'_month', datearr[1]);
				sella.value(selector+'_year', datearr[2]);
			}
		});
	
	}else if(fields == 5){
		$s(selector+'_minute').datepicker({
			showOn:'button',
			buttonText: 'Choose a date',
			dateFormat: 'dd/mm/yy',
			onClose: function(date) {
				var datearr = date.split('/');
				var c = new Date ();
				sella.value(selector+'_day', datearr[0]);
				sella.value(selector+'_month', datearr[1]);
				sella.value(selector+'_year', datearr[2]);
				sella.value(selector+'_hour', c.getHours().pad(2));
				sella.value(selector+'_minute', c.getMinutes().pad(2));
			}
		});
	}

};


sella.add_custom_shipping_fields = function(selector) {
	if(typeof selector === 'undefined') selector = '#shipping_custom_container';

	if(!$s(selector).length) return false;
	var length = $s(selector+' > .shipping_custom_fieldgroup').length -1;
	$s(selector+' > .shipping_custom_fieldgroup').each( function(i){
		var empty = true;
		var inputs = $s(this).find('input');

		for(var j=0; j<inputs.length; j++){//TODO: Refactor this with .each()
			if(inputs[j].value && inputs[j].value.length > 0){
				empty = false;
			}
		};

		if(empty && length != i){//should pass in event target if needed
			$s(this).remove();
		}else if(!empty && length == i){
			var count = i+1;
			var html = '<div id="shipping_custom_'+count+'" class="shipping_custom_fieldgroup"><div class="shipping_custom_label">$</div><div class="shipping_custom_cost_wrapper"><input type="text" name="shipping_custom[cost][]" id="shipping_custom_cost_'+count+'" maxlength="6" class="shipping_custom_cost" value="" /></div><div class="shipping_custom_details_wrapper"><input type="text" name="shipping_custom[details][]" id="shipping_custom_details_'+count+'" maxlength="50" class="shipping_custom_details" value="" /></div></div>';
			$s(selector).append(html);
		}
	});

	return true;
};


sella.custom_shipping_fields = function(selector, webmethod, listing_id) {
	if(typeof selector === 'undefined') selector = '#shipping_custom_container';
	if(typeof webmethod === 'undefined') webmethod = 'default';
	if(typeof listing_id === 'undefined') listing_id = '';

	if(!$s(selector).length) return false;
	var length = $s(selector+' > .shipping_custom_fieldgroup').length -1;
	$s(selector+' > .shipping_custom_fieldgroup').each( function(i){
		var empty = true;
		var inputs = $(this).find('input');

		for(var j=0; j<inputs.length; j++){//TODO: Refactor this with .each()
			if(inputs[j].value && inputs[j].value.length > 0){
				empty = false;
			}
		};

		if(empty && length != i){//should pass in event target if needed
			$s(this).remove();
		}else if(!empty && length == i){
			sella.ajax.get(sella.widget_url('custom_shipping_fieldgroup',webmethod, listing_id, 'shipping_custom'),
				function (response){
					var html = sella.eval_json(response.responseText);
					$s(selector).append(html);
					//var current = $s(selector+' > .shipping_custom_fieldgroup').length;
					//the numbering of inserted groups is off which affects the ID value of the div & inputs, do we use these?
				}
			);
		}

	});

	return true;
};


//http://www.quirksmode.org/js/cookies.html
sella.readCookie = function(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
};


sella.upload_images = function(selector, data) {
	if(typeof selector === 'undefined') selector = '#multi_uploader';
	if(!$s(selector).length) return false;

	data.session_key = sella.readCookie('session');

	$s(selector).fileUpload({
	  'uploader':  '/images/widget/uploader.swf',
	  'script':    '/list/upload-image/',
	  'folder':    '/uploads',
	  'cancelImg': '/images/icon-del-sm.gif',
	  'fileDataName':'image',
	  'multi':true,
	  'auto':true,
	  'fileDesc':'Files must be a .jpg, .gif or .png and be under 2MB',
	  'fileExt':'*.jpg;*.gif;*.png;*.jpeg',
	  'sizeLimit':2097152,
	  'simUploadLimit':10,
	  'buttonImg':'/images/button-add-an-image.png',
	  'width':165,
	  'height':24,
	  'buttonText':'Add an Image',
	  'scriptData':data,
	  'onError': sella.image.onerror,
	  'onSelect': sella.image.onselect,
	  'onComplete': function(event, queueID, fileObj, response, queuedata){ return sella.image.oncomplete(event, queueID, fileObj, response, queuedata, data, selector); }
	});
};

/****************************************************************************************************************************
 *
 * THIRD PARTY - not jQuery related  
 *
 ****************************************************************************************************************************/

 /*
 * Is the client running IE6?
 */
function getIEVersionNumber(target) {
	var ua = navigator.userAgent;
	var MSIEOffset = ua.indexOf("MSIE ");
	if (MSIEOffset == -1) {
		return false;
	} else {
		var v = parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
		if (v <= target) {
			return true;
		} else {
			return false;
		}
	}
}

/*SWF Object Script*/
if(typeof deconcept=="undefined"){var deconcept=new Object();}
if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}
if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){if(!document.getElementById){return;}
this.DETECT_KEY=_b?_b:"detectflash";
this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
this.params=new Object();
this.variables=new Object();
this.attributes=new Array();
if(_1){this.setAttribute("swf",_1);}
if(id){this.setAttribute("id",id);}
if(w){this.setAttribute("width",w);}
if(h){this.setAttribute("height",h);}
if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
if(c){this.addParam("bgcolor",c);}
var q=_8?_8:"high";
this.addParam("quality",q);
this.setAttribute("useExpressInstall",_7);
this.setAttribute("doExpressInstall",false);
var _d=(_9)?_9:window.location;
this.setAttribute("xiRedirectUrl",_d);
this.setAttribute("redirectUrl","");
if(_a){this.setAttribute("redirectUrl",_a);}};
deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
this.attributes[_e]=_f;
},getAttribute:function(_10){
return this.attributes[_10];
},addParam:function(_11,_12){
this.params[_11]=_12;
},getParams:function(){
return this.params;
},addVariable:function(_13,_14){
this.variables[_13]=_14;
},getVariable:function(_15){
return this.variables[_15];
},getVariables:function(){
return this.variables;
},getVariablePairs:function(){
var _16=new Array();
var key;
var _18=this.getVariables();
for(key in _18){_16.push(key+"="+_18[key]);}
return _16;},getSWFHTML:function(){var _19="";
if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
if(this.getAttribute("doExpressInstall")){
this.addVariable("MMplayerType","PlugIn");}
_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
var _1a=this.getParams();
for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
var _1c=this.getVariablePairs().join("&");
if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";
}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
var _1d=this.getParams();
for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
var _1f=this.getVariablePairs().join("&");
if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}
return _19;
},write:function(_20){
if(this.getAttribute("useExpressInstall")){
var _21=new deconcept.PlayerVersion([6,0,65]);
if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
this.setAttribute("doExpressInstall",true);
this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
document.title=document.title.slice(0,47)+" - Flash Player Installation";
this.addVariable("MMdoctitle",document.title);}}
if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
var n=(typeof _20=="string")?document.getElementById(_20):_20;
n.innerHTML=this.getSWFHTML();return true;
}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
return false;}};
deconcept.SWFObjectUtil.getPlayerVersion=function(){
var _23=new deconcept.PlayerVersion([0,0,0]);
if(navigator.plugins&&navigator.mimeTypes.length){
var x=navigator.plugins["Shockwave Flash"];
if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}
catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}
catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}
catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}
return _23;};
deconcept.PlayerVersion=function(_27){
this.major=_27[0]!=null?parseInt(_27[0]):0;
this.minor=_27[1]!=null?parseInt(_27[1]):0;
this.rev=_27[2]!=null?parseInt(_27[2]):0;
};
deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
if(this.major<fv.major){return false;}
if(this.major>fv.major){return true;}
if(this.minor<fv.minor){return false;}
if(this.minor>fv.minor){return true;}
if(this.rev<fv.rev){
return false;
}return true;};
deconcept.util={getRequestParameter:function(_29){
var q=document.location.search||document.location.hash;
if(q){var _2b=q.substring(1).split("&");
for(var i=0;i<_2b.length;i++){
if(_2b[i].substring(0,_2b[i].indexOf("="))==_29){
return _2b[i].substring((_2b[i].indexOf("=")+1));}}}
return "";}};
deconcept.SWFObjectUtil.cleanupSWFs=function(){if(window.opera||!document.all){return;}
var _2d=document.getElementsByTagName("OBJECT");
for(var i=0;i<_2d.length;i++){_2d[i].style.display="none";for(var x in _2d[i]){
if(typeof _2d[i][x]=="function"){_2d[i][x]=function(){};}}}};
deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};
__flash_savedUnloadHandler=function(){};
if(typeof window.onunload=="function"){
var _30=window.onunload;
window.onunload=function(){
deconcept.SWFObjectUtil.cleanupSWFs();_30();};
}else{window.onunload=deconcept.SWFObjectUtil.cleanupSWFs;}};
if(typeof window.onbeforeunload=="function"){
var oldBeforeUnload=window.onbeforeunload;
window.onbeforeunload=function(){
deconcept.SWFObjectUtil.prepUnload();
oldBeforeUnload();};
}else{window.onbeforeunload=deconcept.SWFObjectUtil.prepUnload;}
if(Array.prototype.push==null){
Array.prototype.push=function(_31){
this[this.length]=_31;
return this.length;};}
var getQueryParamValue=deconcept.util.getRequestParameter;
var FlashObject=deconcept.SWFObject;
var SWFObject=deconcept.SWFObject;
