	function v_toggleClass(e, panelName){
			if (e.className == 'topBar') {
				v_createCookie(panelName+'_cookie','1',365);
				e.className = 'topBar up'; 
			} else { 
				v_createCookie(panelName+'_cookie','0',365);
				e.className = 'topBar';
			}
	}
	
	function v_createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	
	function v_readCookie(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;
	}
	
	function v_eraseCookie(name) {
		v_createCookie(name,"",-1);
	}
	
	function v_addEvent(obj, evType, fn){ 
		if (obj.addEventListener){ 
			obj.addEventListener(evType, fn, false); 
	   		return true; 
	 	} else if (obj.attachEvent){ 
	   		var r = obj.attachEvent("on"+evType, fn); 
	   		return r; 
		} else { 
	   		return false; 
	 	} 
	}

function ajaxSavePage(){

	ajax = new sack();

	ajax.requestFile = '/ajax/bookmarks/save/';

	ajax.onCompletion = function(){pageSaved(ajax);};

	ajax.runAJAX();

}



function ajaxRemovePage(id){

	ajax = new sack();

	ajax.requestFile = '/ajax/bookmarks/remove/csv_id,' + id;

	ajax.onCompletion = function(){removeBookmark(id, ajax);};

	ajax.runAJAX();

}



function pageSaved(ajax){

	var color,text;

	if(ajax.response=='OK'){

		color = "green";

		text = 'Zapisano.';

	}else if(ajax.response=='exists'){

		color = "green";

		text = 'Strona była już zapamiętana.';

	}else{

		color = "red";

		text = 'Nie udało się zapisać strony.';

	}

	document.getElementById('ajax_test').style.color = color;

	document.getElementById('ajax_test').style.display = 'block';

	document.getElementById('ajax_test').innerHTML = text;

}



function removeBookmark(id, ajax){

	if(ajax.response=='OK'){

		bookmarkDiv = document.getElementById('bookmark_'+id);

		bookmarkDiv.parentNode.removeChild(bookmarkDiv);

		

		bookmarks_length--;

		if(bookmarks_length==0)

			document.getElementById('bookmarks_header').innerHTML='Nie masz żadnych zapamiętanych stron.';

	}

}





function getViewportSize()

{

 var size = [0, 0];



 if (typeof window.innerWidth != 'undefined')

 {

   size = [

       window.innerWidth,

       window.innerHeight

   ];

 }

 else if (typeof document.documentElement != 'undefined'

     && typeof document.documentElement.clientWidth !=

     'undefined' && document.documentElement.clientWidth != 0)

 {

   size = [

       document.documentElement.clientWidth,

       document.documentElement.clientHeight

   ];

 }

 else

 {

   size = [

       document.getElementsByTagName('body')[0].clientWidth,

       document.getElementsByTagName('body')[0].clientHeight

   ];

 }



 return size;

}


//
//
//
//

function reloadShoppingHistory(){

	if(document.getElementById('customPeriod').checked){

		from = document.getElementById('fromDate').value;

		to = document.getElementById('toDate').value;

		get = 'period,custom,from,'+from+',to,'+to;

	}else

		get = 'period,lastMonth';

	ajax = new sack();

	ajax.requestFile = '/ajax/shopping_history/'+get;

	ajax.onCompletion = function(){updateShoppingHistory(ajax);};

	ajax.runAJAX();

}



function updateShoppingHistory(ajax){

	document.getElementById('shopping_history').innerHTML = ajax.response;

}


/************************************************************************************************************

	(C) www.dhtmlgoodies.com, October 2005

	

	This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	

	

	Terms of use:

	You are free to use this script as long as the copyright message is kept intact. However, you may not

	redistribute, sell or repost it without our permission.

	

	Updated:

	

	February, 22nd 2006 - Instead of skipping onclick events when slide is in progress, start sliding in the other direction if mouse is clicked the second time.

	April, 	23rd 2006 - Added support for having only one pane expanded simultaneously( xpPanel_onlyOneExpandedPane)

	

	

	Thank you!

	

	www.dhtmlgoodies.com

	Alf Magne Kalleland

	

	************************************************************************************************************/	



	/* Update LOG 

	

	January, 28th - Fixed problem when double clicking on a pane(i.e. expanding and collapsing).

	

	*/

	

	var ins_panelTitles = new Array();

	var ins_panelDisplayed = new Array();

	var ins_cookieArray = new Array();



	var xpPanel_slideActive = true;	// Slide down/up active?

	var xpPanel_slideSpeed = 30;	// Speed of slide

	var xpPanel_onlyOneExpandedPane = false;	// Only one pane expanded at a time ?

	

	var v_slideDuration = 500;

	var v_startTime = 0;

	var	v_now = 0;

	var v_to = 0;

	var v_from = 0;

	var v_slideTimer = null;

	

	var v_subDiv = null;

	var v_activePane = null;

	

	var dhtmlgoodies_xpPane;

	var dhtmlgoodies_paneIndex;

	

	var savedActivePane = false;

	var savedActiveSub = false;



	var xpPanel_currentDirection = new Array();



	var cookieNames = new Array();

	



	var currentlyExpandedPane = false;

	

	/*

	These cookie functions are downloaded from 

	http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm

	*/	

	var cookiePrefix = "AR_PNLS_"

	function Get_Cookie(name) { 

		name = cookiePrefix+name;

	   var start = document.cookie.indexOf(name+"="); 

	   var len = start+name.length+1; 

	   if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 

	   if (start == -1) return null; 

	   var end = document.cookie.indexOf(";",len); 

	   if (end == -1) end = document.cookie.length; 

	   return unescape(document.cookie.substring(len,end)); 

	} 

	// This function has been slightly modified

	function Set_Cookie(name,value,expires,path,domain,secure) { 

		name = cookiePrefix+name;

		expires = expires * 60*60*24*1000;

		var today = new Date();

		var expires_date = new Date( today.getTime() + (expires) );

	    var cookieString = name + "=" +escape(value) + 

	       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 

	       ( (path) ? ";path=" + path : "") + 

	       ( (domain) ? ";domain=" + domain : "") + 

	       ( (secure) ? ";secure" : ""); 

	    document.cookie = cookieString; 

	}



	function cancelXpWidgetEvent()

	{

		return false;	

		

	}

	

	function showHidePaneContent(e,inputObj)

	{

		if(!inputObj)inputObj = this;

		

		var img = inputObj.getElementsByTagName('IMG')[0];

		var numericId = img.id.replace(/[^0-9]/g,'');

		var obj = document.getElementById('paneContent' + numericId);

		if(img.src.toLowerCase().indexOf('up')>=0){

			currentlyExpandedPane = false;

			img.src = img.src.replace('up','down');

			if(xpPanel_slideActive){

				obj.style.display='block';

				xpPanel_currentDirection[obj.id] = (xpPanel_slideSpeed*-1);

				slidePane((xpPanel_slideSpeed*-1), obj.id);

			}else{

				obj.style.display='none';

			}

			if(cookieNames && cookieNames[numericId]) {

				Set_Cookie(cookieNames[numericId],'0',100000,'/');

			}

		}else{

			if(this){

				if(currentlyExpandedPane && xpPanel_onlyOneExpandedPane)showHidePaneContent(false,currentlyExpandedPane);

				currentlyExpandedPane = this;	

			}else{

				currentlyExpandedPane = false;

			}

			img.src = img.src.replace('down','up');

			if(xpPanel_slideActive){

				if(document.all){

					obj.style.display='block';

					//obj.style.height = '1px';

				}

				xpPanel_currentDirection[obj.id] = xpPanel_slideSpeed;

				slidePane(xpPanel_slideSpeed,obj.id);

			}else{

				obj.style.display='block';

				subDiv = obj.getElementsByTagName('DIV')[0];

				obj.style.height = subDiv.offsetHeight + 'px';

			}

			if(cookieNames && cookieNames[numericId]) {

				Set_Cookie(cookieNames[numericId],'1',100000,'/');

			}

		}	

		return true;	

	}

	

	function speedMod(pos){

		return ((-Math.cos(pos*Math.PI)/2) + 0.5);

		//this transition is from script.aculo.us

	}

	

	function slidePaneStep(){

		var time  = (new Date).getTime();

		if (time >= v_slideDuration+v_startTime) {

			v_now = v_to;

			clearInterval (v_slideTimer);

			v_slideTimer = null;

		}

		else {

			var Tpos = (time - v_startTime) / (v_slideDuration);

			v_now = speedMod(Tpos) * (v_to-v_from) + v_from;

		}

		slideIncrease();

	}

	

	function slideIncrease(){

		v_subDiv.style.top = v_now - v_subDiv.offsetHeight + 'px';

		v_activePane.style.height = v_now + 'px';

	}

	

	function custom(from, to){

		if (v_slideTimer != null) return;

		v_from = from;

		v_to = to;

		v_startTime = (new Date).getTime();

		v_slideTimer = setInterval ('slidePaneStep()', 13);

	}

	

	function slidePane(slideValue,id)

	{

		if(slideValue!=xpPanel_currentDirection[id]){

			return false;

		}

		v_activePane = document.getElementById(id);

		if(v_activePane==savedActivePane){

			v_subDiv = savedActiveSub;

		}else{

			v_subDiv = v_activePane.getElementsByTagName('DIV')[0];

		}

		savedActivePane = v_activePane;

		savedActiveSub = v_subDiv;

		

		var height = v_activePane.offsetHeight;

		var innerHeight = v_subDiv.offsetHeight;

		

		if (height > 1){

			custom(height, 0);

		} else {

			custom(0, height+innerHeight);

		}

	}

	

	function mouseoverTopbar()

	{

		var img = this.getElementsByTagName('IMG')[0];

		var src = img.src;

		img.src = img.src.replace('.gif','_over.gif');

		

		var span = this.getElementsByTagName('SPAN')[0];

		span.style.color='#428EFF';		

		

	}

	function mouseoutTopbar()

	{

		var img = this.getElementsByTagName('IMG')[0];

		var src = img.src;

		img.src = img.src.replace('_over.gif','.gif');		

		

		var span = this.getElementsByTagName('SPAN')[0];

		span.style.color='';

		

		

		

	}

	

	function v_addPanel(panelTitles,panelDisplayed,cookieArray){

		ins_panelTitles[ins_panelTitles.length] = panelTitles;

		ins_panelDisplayed[ins_panelDisplayed.length] = panelDisplayed;

		ins_cookieArray[ins_cookieArray.length] = cookieArray;

	}

	

	function v_initPanels(paneId){

		if (ins_panelTitles.length > 0){

			initDhtmlgoodies_xpPane(paneId,ins_panelTitles,ins_panelDisplayed,ins_cookieArray);

		}

	}

	

	

	function initDhtmlgoodies_xpPane(paneId,panelTitles,panelDisplayed,cookieArray)

	{

		dhtmlgoodies_xpPane = document.getElementById(paneId);

		var divs = dhtmlgoodies_xpPane.getElementsByTagName('DIV');

		dhtmlgoodies_paneIndex=0;

		cookieNames = cookieArray;

		for(var no=0;no<divs.length;no++){

			if(divs[no].className=='dhtmlgoodies_panel'){

				

				var outerContentDiv = document.createElement('DIV');	

				var contentDiv = divs[no].getElementsByTagName('DIV')[0];

				outerContentDiv.appendChild(contentDiv);	

			

				outerContentDiv.id = 'paneContent' + dhtmlgoodies_paneIndex;

				outerContentDiv.className = 'panelContent';

				var topBar = document.createElement('DIV');

				topBar.onselectstart = cancelXpWidgetEvent;

				var span = document.createElement('SPAN');				

				span.innerHTML = panelTitles[dhtmlgoodies_paneIndex];

				topBar.appendChild(span);

				topBar.onclick = showHidePaneContent;

				if(document.all)topBar.ondblclick = showHidePaneContent;

				topBar.onmouseover = mouseoverTopbar;

				topBar.onmouseout = mouseoutTopbar;

				topBar.style.position = 'relative';



				var img = document.createElement('IMG');

				img.id = 'showHideButton' + dhtmlgoodies_paneIndex;

				img.src = '/i/dynamic_content_up_arrow.gif';				

				topBar.appendChild(img);

				

				if(cookieArray && cookieArray[dhtmlgoodies_paneIndex]){

					cookieValue = Get_Cookie(cookieArray[dhtmlgoodies_paneIndex]);

					if(cookieValue)panelDisplayed[dhtmlgoodies_paneIndex] = cookieValue==1?true:false;

				}



				if(!panelDisplayed[dhtmlgoodies_paneIndex]){

					outerContentDiv.style.height = '0px';

					contentDiv.style.top = 0 - contentDiv.offsetHeight + 'px';

					if(document.all)outerContentDiv.style.display='none';

					img.src = '/i/dynamic_content_down_arrow.gif';

				}

								

				topBar.className='topBar';

				divs[no].appendChild(topBar);				

				divs[no].appendChild(outerContentDiv);	

				dhtmlgoodies_paneIndex++;			

			}			

		}

	}

//
//
//
//

function searchSubmit(where, params){
	
	var form = document.getElementById('searchFrm');
	if (where == 'item'){
		var target = '/katalog/szukaj,';
		var value = document.getElementById('inp_item').value.replace(/\//g,"~").replace(/,/g,"_");
	} 
	
	if (where == 'number'){
		var target = '/katalog/numer,';
		var value = document.getElementById('inp_number').value.replace(/\//g,"~").replace(/,/g,"_");
	}
	target += value
	
	if (params) target += ',' + params;
	
	window.location = target;
	
	return false;
	
}

/************************************************************************************************************
	(C) www.dhtmlgoodies.com, September 2005
	
	This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	
	
	Terms of use:
	You are free to use this script as long as the copyright message is kept intact. However, you may not
	redistribute, sell or repost it without our permission.
	
	Thank you!
	
	www.dhtmlgoodies.com
	Alf Magne Kalleland
	
	************************************************************************************************************/	

function scrollingContainer(containerName) {
	
	this.containerName = containerName;
	this.currObjName = '';
	
	this.contentHeight = 0; 	// The total height of the content
	this.visibleContentHeight = 0;	
	this.scrollActive = false;
	
	this.scrollHandleObj = false; // reference to the scroll handle
	this.scrollHandleHeight = false;
	this.scrollbarTop = false;
	this.eventYPos = false;

	this.scrollbuttonActive = false;
	this.scrollbuttonDirection = false;
	this.scrollbuttonSpeed = 2; // How fast the content scrolls when you click the scroll buttons(Up and down arrows)
	this.scrollTimer = 10;	// Also how fast the content scrolls. By decreasing this value, the content will move faster	
	
	this.scrollMoveToActive = false;
	this.scrollMoveToYPosition = false;

	this.init = function(currObjName)
	{
		this.currObjName = currObjName;
		this.visibleContentHeight = document.getElementById(this.containerName + '_scrollbar').offsetHeight ;
		this.contentHeight = document.getElementById(this.containerName + '_content').offsetHeight - this.visibleContentHeight;
		this.scrollHandleObj = document.getElementById(this.containerName + '_theScroll');
		this.scrollHandleHeight = this.scrollHandleObj.offsetHeight;
		// fix if content is smaller than box size
		if (this.contentHeight < this.scrollHandleHeight) {
			this.contentHeight = 0;
			document.getElementById(this.containerName + '_slider').style.visibility = "hidden";
		} else {
			document.getElementById(this.containerName + '_slider').style.visibility = "visible";
		}
		this.scrollbarTop = document.getElementById(this.containerName + '_scrollbar').offsetTop;		
		document.getElementById(this.containerName + '_theScroll').onmousedown = createMethodReference(this, "startScroll");
		document.getElementById(this.containerName + '_scrollbar').onselectstart = createMethodReference(this, "cancelEvent");
		document.getElementById(this.containerName + '_theScroll').onmouseup = createMethodReference(this, "stopScroll");
		if(document.all)document.body.onmouseup = createMethodReference(this, "stopScroll"); else document.documentElement.onmouseup = createMethodReference(this, "stopScroll");
		document.getElementById(this.containerName + '_scrollDown').onmousedown = createMethodReference(this, "scrollButtonDown");
		document.getElementById(this.containerName + '_scrollUp').onmousedown = createMethodReference(this, "scrollButtonUp");
		document.getElementById(this.containerName + '_scrollDown').onmouseup = createMethodReference(this, "scrollButtonStop");
		document.getElementById(this.containerName + '_scrollUp').onmouseup = createMethodReference(this, "scrollButtonStop");
		document.getElementById(this.containerName + '_scrollUp').onselectstart = createMethodReference(this, "cancelEvent");
		document.getElementById(this.containerName + '_scrollDown').onselectstart = createMethodReference(this, "cancelEvent");
		document.getElementById(this.containerName + '_scrollbar').onmousedown = createMethodReference(this, "scrollMoveToInit");
	}
	
	this.startScroll = function(e)
	{
		if(document.all)e = event;
		this.scrollbarTop = document.getElementById(this.containerName + '_theScroll').offsetTop;
		this.eventYPos = e.clientY;
		this.scrollActive = true;
		document.body.onmousemove = createMethodReference(this, "scroll");
	}
	
	this.stopScroll = function()
	{
		this.scrollActive = false;
		this.scrollbuttonActive = false;
		this.scrollMoveToActive = false;
		document.body.onmousemove = null;
	}
	this.scroll = function(e)
	{
		if(!this.scrollActive)return;
		if(document.all)e = event;
		if(e.button!=1 && document.all && !window.opera)return;
		var topPos = this.scrollbarTop + e.clientY - this.eventYPos; 
		if(topPos<0)topPos=0;
		if(topPos/1>this.visibleContentHeight-(this.scrollHandleHeight+4)/1)topPos = this.visibleContentHeight-(this.scrollHandleHeight+4);
		document.getElementById(this.containerName + '_theScroll').style.top = topPos + 'px';
		document.getElementById(this.containerName + '_content').style.top = 0 - Math.floor((this.contentHeight) * ((topPos)/(this.visibleContentHeight-this.scrollHandleHeight)))+'px' 
	}
	
	/*
	Click on the slider
	Move the content to the this point
	*/
	this.scrollMoveToInit = function(e)
	{		
		return;
		if(document.all)e = event;
		this.scrollMoveToActive = true;
		this.scrollMoveToYPosition = e.clientY - document.getElementById(this.containerName + '_scrollbar').offsetTop;
		if(document.getElementById(this.containerName + '_theScroll').offsetTop/1 > this.scrollMoveToYPosition) this.scrollbuttonDirection = this.scrollbuttonSpeed*-2; else  this.scrollbuttonDirection = this.scrollbuttonSpeed*2;
		this.scrollMoveTo();	
	}
	
	this.scrollMoveTo = function()
	{
		if(!this.scrollMoveToActive || this.scrollActive)return;
		var topPos = document.getElementById(this.containerName + '_theScroll').style.top.replace('px','');
		topPos = topPos/1 + this.scrollbuttonDirection;
		if(topPos<0){
			topPos=0;
			this.scrollMoveToActive=false;
		}
		if(topPos/1>this.visibleContentHeight-(this.scrollHandleHeight+4)/1){
			topPos = this.visibleContentHeight-(this.scrollHandleHeight+4);	
			this.scrollMoveToActive=false;
		}
		if(this.scrollbuttonDirection<0 && topPos<this.scrollMoveToYPosition-this.scrollHandleHeight/2)return;	
		if(this.scrollbuttonDirection>0 && topPos>this.scrollMoveToYPosition-this.scrollHandleHeight/2)return;			
		document.getElementById(this.containerName + '_theScroll').style.top = topPos + 'px';
		document.getElementById(this.containerName + '_content').style.top = 0 - Math.floor((this.contentHeight) * ((topPos)/(this.visibleContentHeight-this.scrollHandleHeight)))+'px' 		
		setTimeout(this.currObjName + ".scrollMoveTo()",this.scrollTimer);		
	}
	
	this.cancelEvent = function()
	{
		return false;			
	}

	this.scrollButtonDown = function()
	{
		this.scrollbuttonDirection = this.scrollbuttonSpeed;
		this.scrollbuttonActive=true;
		this.scrollButtonScroll();
	}

	this.scrollButtonUp = function()
	{
		this.scrollbuttonDirection = this.scrollbuttonSpeed*-1;
		this.scrollbuttonActive=true;
		this.scrollButtonScroll();
	}

	
	this.scrollButtonScroll = function()
	{
		if(!this.scrollbuttonActive)return;
		var topPos = document.getElementById(this.containerName + '_theScroll').style.top.replace('px','');
		topPos = topPos/1 + this.scrollbuttonDirection;
		if(topPos<0){
			topPos=0;
			this.scrollbuttonActive=false;
		}
		if(topPos/1>this.visibleContentHeight-(this.scrollHandleHeight+4)/1){
			topPos = this.visibleContentHeight-(this.scrollHandleHeight+4);	
			this.scrollbuttonActive=false;
		}	
		document.getElementById(this.containerName + '_theScroll').style.top = topPos + 'px';
		document.getElementById(this.containerName + '_content').style.top = 0 - Math.floor((this.contentHeight) * ((topPos)/(this.visibleContentHeight-this.scrollHandleHeight)))+'px';
		setTimeout(this.currObjName + ".scrollButtonScroll()",this.scrollTimer);
	}
	this.scrollButtonStop = function()
	{
		this.scrollbuttonActive = false;
	}
	
	/*
	Change from the default color
	*/	
	this.setColor = function(rgbColor)
	{
		document.getElementById(this.containerName + '_scrollbar').style.borderColor = rgbColor;
		document.getElementById(this.containerName + '_theScroll').style.backgroundColor = rgbColor;
		document.getElementById(this.containerName + '_scrollUp').style.borderColor = rgbColor;
		document.getElementById(this.containerName + '_scrollDown').style.borderColor = rgbColor;
		document.getElementById(this.containerName + '_scrollUp').style.color = rgbColor;
		document.getElementById(this.containerName + '_scrollDown').style.color = rgbColor;
		document.getElementById(this.containerName + '_parentContainer').style.borderColor = rgbColor;
	}
	/*
	Setting total width of scrolling div
	*/
	this.setWidth = function(newWidth)
	{
		document.getElementById(this.containerName).style.width = newWidth + 'px';
		document.getElementById(this.containerName + '_parentContainer').style.width = newWidth-16 + 'px';		
	}
	
	/*
	Setting total height of scrolling div
	*/
	this.setHeight = function(newHeight)
	{
		document.getElementById(this.containerName).style.height = newHeight + 'px';
		document.getElementById(this.containerName + '_parentContainer').style.height = newHeight + 'px';
		document.getElementById(this.containerName + '_slider').style.height = newHeight + 'px';
		document.getElementById(this.containerName + '_scrollbar').style.height = newHeight-22 + 'px';		
	}
	/*
	Setting new background color to the slider 
	*/
	this.setSliderBgColor = function(rgbColor)
	{
		document.getElementById(this.containerName + '_scrollbar').style.backgroundColor = rgbColor;
		document.getElementById(this.containerName + '_scrollUp').style.backgroundColor = rgbColor;
		document.getElementById(this.containerName + '_scrollDown').style.backgroundColor = rgbColor;
	}
	/*
	Setting new content background color
	*/
	this.setContentBgColor = function(rgbColor)
	{
		document.getElementById(this.containerName + '_parentContainer').style.backgroundColor = rgbColor;
	}
	
	/*
	Setting scroll button speed
	*/
	this.setScrollButtonSpeed = function(newScrollButtonSpeed)
	{
		this.scrollbuttonSpeed = newScrollButtonSpeed;
	}
	/*
	Setting interval of the scroll
	*/
	this.setScrollTimer = function(newInterval)
	{
		this.scrollTimer = newInterval;
	}

}

function createMethodReference(object, methodName) {
    return function () {
        object[methodName].apply(object, arguments);
    };
};





/************************************************************************************************************
(C) www.dhtmlgoodies.com, March 2006

This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	

Terms of use:
You are free to use this script as long as the copyright message is kept intact. However, you may not
redistribute, sell or repost it without our permission.

Version:
	1.0	Released	March. 3rd 2006

Thank you!

www.dhtmlgoodies.com
Alf Magne Kalleland

************************************************************************************************************/
var enumerateDecrement = false;
var flyingSpeed = 35;
var url_addProductToBasket = '/ajax/koszyk/dodaj/';
var url_removeProductFromBasket = '/ajax/koszyk/usun/';
var txt_totalPrice = '';
var txt_currency = ' zł';


var shopping_cart_div = false;
var flyingDiv = false;
var currentProductDiv = false;

var shopping_cart_x = false;
var shopping_cart_y = false;

var slide_xFactor = false;
var slide_yFactor = false;

var diffX = false;
var diffY = false;

var currentXPos = false;
var currentYPos = false;

var ajaxObjects = new Array();


function shoppingCart_getTopPos(inputObj)
{		
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
  }
  return returnValue;
}

function shoppingCart_getLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
  }
  return returnValue;
}

function doAddToBasket(productId){
	if(!shopping_cart_div)shopping_cart_div = document.getElementById('shopping_cart');
	shoppingCart = $('shopping_cart_panel');
	if(shoppingCart && 
		shoppingCart.getElementsByTagName('IMG')[0].src.toLowerCase().indexOf('down')>=0) {
		showHidePaneContent(null,shoppingCart);
	}
	
	ajaxAddProduct(productId);
}
	

function addToBasket(productId)
{
	if(!shopping_cart_div)shopping_cart_div = document.getElementById('shopping_cart');
	// Expand shopping cart if not visible
	shoppingCart = $('shopping_cart_panel');
	if(shoppingCart && 
		shoppingCart.getElementsByTagName('IMG')[0].src.toLowerCase().indexOf('down')>=0) {
		showHidePaneContent(null,shoppingCart);
	}
	if(!flyingDiv){
		flyingDiv = document.createElement('DIV');
		flyingDiv.style.position = 'absolute';
		document.body.appendChild(flyingDiv);
	}
	
	shopping_cart_x = shoppingCart_getLeftPos(shopping_cart_div);
	shopping_cart_y = shoppingCart_getTopPos(shopping_cart_div);

	currentProductDiv = document.getElementById('slidingProduct' + productId);
	
	currentXPos = shoppingCart_getLeftPos(currentProductDiv);
	currentYPos = shoppingCart_getTopPos(currentProductDiv);
	
	diffX = shopping_cart_x - currentXPos;
	diffY = shopping_cart_y - currentYPos;
	

	
	var shoppingContentCopy = currentProductDiv.cloneNode(true);
	shoppingContentCopy.id='';
	flyingDiv.innerHTML = '';
	flyingDiv.style.left = currentXPos + 'px';
	flyingDiv.style.top = currentYPos + 'px';
	flyingDiv.appendChild(shoppingContentCopy);
	flyingDiv.style.display='block';
	flyingDiv.style.width = currentProductDiv.offsetWidth + 'px';
	flyToBasket(productId);
	
}


function flyToBasket(productId)
{
	//removeEmptyBasket();
	var maxDiff = Math.max(Math.abs(diffX),Math.abs(diffY));
	var moveX = (diffX / maxDiff) * flyingSpeed;;
	var moveY = (diffY / maxDiff) * flyingSpeed;	
	
	currentXPos = currentXPos + moveX;
	currentYPos = currentYPos + moveY;
	
	flyingDiv.style.left = Math.round(currentXPos) + 'px';
	flyingDiv.style.top = Math.round(currentYPos) + 'px';	
	
	
	if(moveX>0 && currentXPos > shopping_cart_x){
		flyingDiv.style.display='none';		
	}
	if(moveX<0 && currentXPos < shopping_cart_x){
		flyingDiv.style.display='none';		
	}
		
	if(flyingDiv.style.display=='block')setTimeout('flyToBasket("' + productId + '")',10); else ajaxAddProduct(productId);	
}

function showAjaxBasketContent(ajaxIndex)
{
	// Getting a reference to the shopping cart items table
	var itemBox = document.getElementById('shopping_cart_items');
	
	var productItems = ajaxObjects[ajaxIndex].response.split('|||');	// Breaking response from Ajax into tokens
	
	if(document.getElementById('shoping_cart_items_product' + productItems[0])){	// A product with this id is allready in the basket - just add number items
		var row = document.getElementById('shoping_cart_items_product' + productItems[0]);
		var items = row.cells[2].innerHTML /1;
		items = items + 1;
		row.cells[2].innerHTML = items;
	}else{	// Product isn't allready in the basket - add a new row
		var tr = itemBox.insertRow(-1);
		tr.id = 'shoping_cart_items_product' + productItems[0]

		//var itemsCount = itemBox.rows.length;
		//if (enumerateDecrement) itemsCount = itemsCount-1;
		
		var td = tr.insertCell(-1);
		td.innerHTML = itemBox.rows.length+'.';
		td.className = 'c1';
		td.style.width = '8%';

		var td = tr.insertCell(-1);
		td.innerHTML = '<a href="/produkt/i,'+productItems[0]+'">'+productItems[1]+'</a>'; 	// Description
		td.className = 'c2';
		td.style.width = '50%';
		
		var td = tr.insertCell(-1);
		td.innerHTML = '1'; 	// Number of items
		td.className = 'c3';
		td.style.textAlign = 'right';
		td.style.width = '12%';
		
		var td = tr.insertCell(-1);
		td.style.textAlign = 'right';
		var price0 = productItems[2]*1;
		//alert(productItems[2]);
		if ((price0*100)%100 == 0)
			td.innerHTML = price0.toFixed(0)+txt_currency; 	// Price
		else 
			td.innerHTML = price0.toFixed(2)+txt_currency; 	// Price
		td.style.width = '18%';
		td.style.color = '#ff8800';
		
		var td = tr.insertCell(-1);
		
		var a = document.createElement('A');
		td.appendChild(a);
		td.style.width = '7%';
		a.href = 'javascript:void(null)';
		a.onclick = function(){ removeProductFromBasket(productItems[0]); setTimeout("if(sdc) sdc.init('sdc');", 500); };
		var img = document.createElement('IMG');
		img.src = '/i/remove.gif';
		//img.alt = 'usuń';
		//img.title = 'usuń z koszyka';
		a.appendChild(img);
		a.title = 'Usuń produkt z koszyka';
	} 


	updateTotalPrice();
	
	ajaxObjects[ajaxIndex] = false;		
	
}

function updateTotalPrice()
{
	var itemBox = document.getElementById('shopping_cart_items');
	// Calculating total price and showing it below the table with basket items
	var totalPrice = 0;
	
	if(document.getElementById('shopping_cart_totalprice')){
		modif = (shoppingCart_Standalone ? 1 : 0);
		for(var no=0+modif;no<itemBox.rows.length;no++){
			if (itemBox.rows[no].cells.length > 1){
				var price = itemBox.rows[no].cells[3].innerHTML.replace(/[^0-9.]/g,'');
				var itemCount = itemBox.rows[no].cells[2].innerHTML.replace(/[^0-9]/g,'');
				totalPrice = totalPrice + (itemCount * price);
				// Update position numbers
				itemBox.rows[no].cells[0].innerHTML = (no+1-modif)+".";
			}
		}		
		document.getElementById('shopping_cart_totalprice').innerHTML = txt_totalPrice + totalPrice.toFixed(2) + txt_currency;
	}
	//alert(itemBox.rows.length);
	//var nnRow = document.getElementById('cartIsEmpty');
	//if (nnRow != null && itemBox.rows.length <= 1) createEmptyBasket();	
	//else if (itemBox.rows.length < 1) createEmptyBasket();	
	
}

function removeEmptyBasket(){
	enumerateDecrement = true;
	var nnRow = document.getElementById('cartIsEmpty');
	if (nnRow) nnRow.style.display = 'none';
	//document.getElementById('shopping_cart_items').innerHTML = '';
}

function createEmptyBasket(){
		document.getElementById('shopping_cart_items').innerHTML = '<tr id="cartIsEmpty"><td colspan="5"><h3>Koszyk jest pusty.</h3></td></tr>';
}

function removeProductFromBasket(productId)
{
	var productRow = document.getElementById('shoping_cart_items_product' + productId);
	
	var numberOfItemCell = productRow.cells[2];
	if(numberOfItemCell.innerHTML == '1'){
		productRow.parentNode.removeChild(productRow);	
	}else{
		numberOfItemCell.innerHTML = numberOfItemCell.innerHTML/1 - 1;
	}
	updateTotalPrice();
	ajaxRemoveProduct(productId);	
}

function ajaxValidateRemovedProduct(ajaxIndex)
{
	if(ajaxObjects[ajaxIndex].response!='OK')alert('Błąd serwisu - produkt nie został usunięty z koszyka');
	
}

function ajaxRemoveProduct(productId)
{
	var ajaxIndex = ajaxObjects.length;
	ajaxObjects[ajaxIndex] = new sack();
	ajaxObjects[ajaxIndex].requestFile = url_removeProductFromBasket + 'productId,' + productId;	// Saving product in this file
	ajaxObjects[ajaxIndex].onCompletion = function(){ ajaxValidateRemovedProduct(ajaxIndex); };	// Specify function that will be executed after file has been found
	ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function		
}

function ajaxAddProduct(productId)
{
	
	//alert(url_addProductToBasket + 'productId,' + productId);
	var ajaxIndex = ajaxObjects.length;
	ajaxObjects[ajaxIndex] = new sack();
	
	ajaxObjects[ajaxIndex].requestFile = url_addProductToBasket + 'productId,' + productId;	// Saving product in this file
	ajaxObjects[ajaxIndex].onCompletion = function(){ showAjaxBasketContent(ajaxIndex); };	// Specify function that will be executed after file has been found
	ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function		
}

function invoiceChanged(){
	if (document.getElementById('it1').checked){
		document.getElementById('inv2data').style.display = 'none';
		//document.getElementById('inv3data').style.display = 'none';
	} else if (document.getElementById('it2').checked){
		document.getElementById('inv2data').style.display = 'block';
		//document.getElementById('inv3data').style.display = 'none';
	} else if (document.getElementById('it3').checked){
		document.getElementById('inv2data').style.display = 'none';
		//document.getElementById('inv3data').style.display = 'block';
	}
}

function deliveryChanged(){
	if (document.getElementById('dlvaddr').checked){
		document.getElementById('dlvaddr_content').style.display = 'block';
	} else {
		document.getElementById('dlvaddr_content').style.display = 'none';
	}
}




/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* �2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */

function sack(file) {
	this.xmlhttp = null;

	this.resetData = function() {
		this.method = "POST";
  		this.queryStringSeparator = "?";
		this.argumentSeparator = "&";
		this.URLString = "";
		this.encodeURIString = true;
  		this.execute = false;
  		this.element = null;
		this.elementObj = null;
		this.requestFile = file;
		this.vars = new Object();
		this.responseStatus = new Array(2);
  	};

	this.resetFunctions = function() {
  		this.onLoading = function() { };
  		this.onLoaded = function() { };
  		this.onInteractive = function() { };
  		this.onCompletion = function() { };
  		this.onError = function() { };
		this.onFail = function() { };
	};

	this.reset = function() {
		this.resetFunctions();
		this.resetData();
	};

	this.createAJAX = function() {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e1) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				this.xmlhttp = null;
			}
		}

		if (! this.xmlhttp) {
			if (typeof XMLHttpRequest != "undefined") {
				this.xmlhttp = new XMLHttpRequest();
			} else {
				this.failed = true;
			}
		}
	};

	this.setVar = function(name, value){
		this.vars[name] = Array(value, false);
	};

	this.encVar = function(name, value, returnvars) {
		if (true == returnvars) {
			return Array(encodeURIComponent(name), encodeURIComponent(value));
		} else {
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
		}
	}

	this.processURLString = function(string, encode) {
		encoded = encodeURIComponent(this.argumentSeparator);
		regexp = new RegExp(this.argumentSeparator + "|" + encoded);
		varArray = string.split(regexp);
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split("=");
			if (true == encode){
				this.encVar(urlVars[0], urlVars[1]);
			} else {
				this.setVar(urlVars[0], urlVars[1]);
			}
		}
	}

	this.createURLString = function(urlstring) {
		if (this.encodeURIString && this.URLString.length) {
			this.processURLString(this.URLString, true);
		}

		if (urlstring) {
			if (this.URLString.length) {
				this.URLString += this.argumentSeparator + urlstring;
			} else {
				this.URLString = urlstring;
			}
		}

		// prevents caching of URLString
		this.setVar("rndval", new Date().getTime());

		urlstringtemp = new Array();
		for (key in this.vars) {
			if (false == this.vars[key][1] && true == this.encodeURIString) {
				encoded = this.encVar(key, this.vars[key][0], true);
				delete this.vars[key];
				this.vars[encoded[0]] = Array(encoded[1], true);
				key = encoded[0];
			}

			urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
		}
		if (urlstring){
			this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
		} else {
			this.URLString += urlstringtemp.join(this.argumentSeparator);
		}
	}

	this.runResponse = function() {
		eval(this.response);
	}

	this.runAJAX = function(urlstring) {
		if (this.failed) {
			this.onFail();
		} else {
			this.createURLString(urlstring);
			if (this.element) {
				this.elementObj = document.getElementById(this.element);
			}
			if (this.xmlhttp) {
				var self = this;
				if (this.method == "GET") {
					totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
					this.xmlhttp.open(this.method, totalurlstring, true);
				} else {
					this.xmlhttp.open(this.method, this.requestFile, true);
					try {
						this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
					} catch (e) { }
				}

				this.xmlhttp.onreadystatechange = function() {
					switch (self.xmlhttp.readyState) {
						case 1:
							self.onLoading();
							break;
						case 2:
							self.onLoaded();
							break;
						case 3:
							self.onInteractive();
							break;
						case 4:
							self.response = self.xmlhttp.responseText;
							self.responseXML = self.xmlhttp.responseXML;
							self.responseStatus[0] = self.xmlhttp.status;
							self.responseStatus[1] = self.xmlhttp.statusText;

							if (self.execute) {
								self.runResponse();
							}

							if (self.elementObj) {
								elemNodeName = self.elementObj.nodeName;
								elemNodeName.toLowerCase();
								if (elemNodeName == "input"
								|| elemNodeName == "select"
								|| elemNodeName == "option"
								|| elemNodeName == "textarea") {
									self.elementObj.value = self.response;
								} else {
									self.elementObj.innerHTML = self.response;
								}
							}
							if (self.responseStatus[0] == "200") {
								self.onCompletion();
							} else {
								self.onError();
							}

							self.URLString = "";
							break;
					}
				};

				this.xmlhttp.send(this.URLString);
			}
		}
	};

	this.reset();
	this.createAJAX();
}



/*
 * AdvancedAJAX 1.1.2
 * (c) 2005-2006 Lukasz Lach
 *  mail: anakin@php5.pl
 *  www:  http://advajax.anakin.us/
 *        http://anakin.us/
 * http://creativecommons.org/licenses/LGPL/2.1/
 *
 */

function advAJAX() {

    var obj = new Object();

    obj.url = window.location.href;
    obj.method = "GET";
    obj.parameters = new Object();
    obj.jsonParameters = new Object();
    obj.headers = new Object();
    obj.async = true;
    obj.mimeType = "text/xml";
    obj.username = null;
    obj.password = null;
    obj.form = null;
    obj.disableForm = true;

    obj.unique = true;
    obj.uniqueParameter = "_uniqid";

    obj.requestDone = false;
    obj.queryString = "";
    obj.responseText = null;
    obj.responseXML = null;
    obj.status = null;
    obj.statusText = null;
    obj.aborted = false;
    obj.timeout = 0;
    obj.retryCount = 0;
    obj.retryDelay = 1000;
    obj.tag = null;
    obj.group = null;
    obj.progressTimerInterval = 50;

    obj.xmlHttpRequest = null;

    obj.onInitialization = null;
    obj.onFinalization = null;
    obj.onReadyStateChange = null;
    obj.onLoading = null;
    obj.onLoaded = null;
    obj.onInteractive = null;
    obj.onComplete = null;
    obj.onProgress = null;
    obj.onSuccess = null;
    obj.onFatalError = null;
    obj.onError = null;
    obj.onTimeout = null;
    obj.onRetryDelay = null;
    obj.onRetry = null;
    obj.onGroupEnter = null;
    obj.onGroupLeave = null;

    obj.createXmlHttpRequest = function() {

        if (typeof XMLHttpRequest != "undefined")
            return new XMLHttpRequest();
        var xhrVersion = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0",
                "MSXML2.XMLHttp","Microsoft.XMLHttp" ];
        for (var i = 0; i < xhrVersion.length; i++) {
            try {
                var xhrObj = new ActiveXObject(xhrVersion[i]);
                return xhrObj;
            } catch (e) { }
        }
        obj.raiseEvent("FatalError");
        return null;
    };

    obj._oldResponseLength = null;
    obj._progressTimer = null;
    obj._progressStarted = navigator.userAgent.indexOf('Opera') == -1;
    obj._onProgress = function() {

        if (typeof obj.onProgress == "function" &&
            typeof obj.xmlHttpRequest.getResponseHeader == "function") {
            var contentLength = obj.xmlHttpRequest.getResponseHeader("Content-length");
            if (contentLength != null && contentLength != '') {
                var responseLength = obj.xmlHttpRequest.responseText.length;
                if (responseLength != obj._oldResponseLength) {
                    obj.raiseEvent("Progress", obj, responseLength, contentLength);
                    obj._oldResponseLength = obj.xmlHttpRequest.responseText.length;
                }
            }
        }
        if (obj._progressStarted) return;
        obj._progressStarted = true;
        var _obj = this;
        this.__onProgress = function() {
            obj._onProgress();
            obj._progressTimer = window.setTimeout(_obj.__onProgress, obj.progressTimerInterval);
        }
        _obj.__onProgress();
    }

    obj._onInitializationHandled = false;
    obj._initObject = function() {

        if (obj.xmlHttpRequest != null) {
            delete obj.xmlHttpRequest["onreadystatechange"];
            obj.xmlHttpRequest = null;
        }
        if ((obj.xmlHttpRequest = obj.createXmlHttpRequest()) == null)
            return null;
        if (typeof obj.xmlHttpRequest.overrideMimeType != "undefined")
            obj.xmlHttpRequest.overrideMimeType(obj.mimeType);
        obj.xmlHttpRequest.onreadystatechange = function() {

            if (obj == null || obj.xmlHttpRequest == null)
                return;
            obj.raiseEvent("ReadyStateChange", obj, obj.xmlHttpRequest.readyState);
            obj._onProgress();
            switch (obj.xmlHttpRequest.readyState) {
                case 1: obj._onLoading(); break;
                case 2: obj._onLoaded(); break;
                case 3: obj._onInteractive(); break;
                case 4: obj._onComplete(); break;
            }
        };
        obj._onLoadingHandled =
            obj._onLoadedHandled =
            obj._onInteractiveHandled =
            obj._onCompleteHandled = false;
    };

    obj._onLoading = function() {

        if (obj._onLoadingHandled)
            return;
        if (!obj._retry && obj.group != null) {
            if (typeof advAJAX._groupData[obj.group] == "undefined")
                advAJAX._groupData[obj.group] = 0;
            advAJAX._groupData[obj.group]++;
            if (typeof obj.onGroupEnter == "function" && advAJAX._groupData[obj.group] == 1)
                obj.onGroupEnter(obj);
        }
        obj.raiseEvent("Loading", obj);
        obj._onLoadingHandled = true;
    };
    obj._onLoaded = function() {

        if (obj._onLoadedHandled)
            return;
        obj.raiseEvent("Loaded", obj);
        obj._onLoadedHandled = true;
    };
    obj._onInteractive = function() {

        if (obj._onInteractiveHandled)
            return;
        obj.raiseEvent("Interactive", obj);
        obj._onInteractiveHandled = true;
        if (!obj._progressStarted)
            obj._onProgress();
    };
    obj._onComplete = function() {

        if (obj._onCompleteHandled || obj.aborted)
            return;
        if (obj._progressStarted) {
            window.clearInterval(obj._progressTimer);
            obj._progressStarted = false;
        }
        obj.requestDone = true;
        with (obj.xmlHttpRequest) {
            obj.responseText = responseText;
            obj.responseXML = responseXML;
            if (typeof status != "undefined")
                obj.status = status;
            if (typeof statusText != "undefined")
                obj.statusText = statusText;
        }
        obj.raiseEvent("Complete", obj);
        obj._onCompleteHandled = true;
        if (obj.status == 200)
            obj.raiseEvent("Success", obj); else
            obj.raiseEvent("Error", obj);
        delete obj.xmlHttpRequest['onreadystatechange'];
        obj.xmlHttpRequest = null;
        if (obj.disableForm)
            obj.switchForm(true);
        obj._groupLeave();
        obj.raiseEvent("Finalization", obj);
    };

    obj._groupLeave = function() {

        if (obj.group != null) {
            advAJAX._groupData[obj.group]--;
            if (advAJAX._groupData[obj.group] == 0)
                obj.raiseEvent("GroupLeave", obj);
        }
    };

    obj._retry = false;
    obj._retryNo = 0;
    obj._onTimeout = function() {

        if (obj == null || obj.xmlHttpRequest == null || obj._onCompleteHandled)
            return;
        obj.aborted = true;
        obj.xmlHttpRequest.abort();
        obj.raiseEvent("Timeout", obj);
        obj._retry = true;
        if (obj._retryNo != obj.retryCount) {
            obj._initObject();
            if (obj.retryDelay > 0) {
                obj.raiseEvent("RetryDelay", obj);
                startTime = new Date().getTime();
                while (new Date().getTime() - startTime < obj.retryDelay);
            }
            obj._retryNo++;
            obj.raiseEvent("Retry", obj, obj._retryNo);
            obj.run();
        } else {
            delete obj.xmlHttpRequest["onreadystatechange"];
            obj.xmlHttpRequest = null;
            if (obj.disableForm)
                obj.switchForm(true);
            obj._groupLeave();
            obj.raiseEvent("Finalization", obj);
        }
    };

    obj.run = function() {

        obj._initObject();
        if (obj.xmlHttpRequest == null)
            return false;
        obj.aborted = false;
        if (!obj._onInitializationHandled) {
            obj.raiseEvent("Initialization", obj);
            obj._onInitializationHandled = true;
        }
        if (obj.method == "GET" && obj.unique)
            obj.parameters[encodeURIComponent(obj.uniqueParameter)] =
            new Date().getTime().toString().substr(5) + Math.floor(Math.random() * 100).toString();
        if (!obj._retry) {
            for (var a in obj.parameters) {
                if (obj.queryString.length > 0)
                    obj.queryString += "&";
                if (typeof obj.parameters[a] != "object")
                    obj.queryString += encodeURIComponent(a) + "=" + encodeURIComponent(obj.parameters[a]); else {
                    for (var i = 0; i < obj.parameters[a].length; i++)
                        obj.queryString += encodeURIComponent(a) + "=" + encodeURIComponent(obj.parameters[a][i]) + "&";
                    obj.queryString = obj.queryString.slice(0, -1);
                }
            }
            for (var a in obj.jsonParameters) {
                var useJson = typeof [].toJSONString == 'function';
                if (obj.queryString.length > 0)
                    obj.queryString += "&";
                obj.queryString += encodeURIComponent(a) + "=";
                if (useJson)
                    obj.queryString += encodeURIComponent(obj.jsonParameters[a].toJSONString()); else
                    obj.queryString += encodeURIComponent(obj.jsonParameters[a]);
            }
            if (obj.method == "GET" && obj.queryString.length > 0)
                obj.url += (obj.url.indexOf("?") != -1 ? "&" : "?") + obj.queryString;
        }
        if (obj.disableForm)
            obj.switchForm(false);
        try {
            obj.xmlHttpRequest.open(obj.method, obj.url, obj.async, obj.username || '', obj.password || '');
        } catch (e) {
            obj.raiseEvent("FatalError", obj, e);
            return;
        }
        if (obj.timeout > 0)
            setTimeout(obj._onTimeout, obj.timeout);
        if (typeof obj.xmlHttpRequest.setRequestHeader != "undefined")
            for (var a in obj.headers)
                obj.xmlHttpRequest.setRequestHeader(encodeURIComponent(a), encodeURIComponent(obj.headers[a]));
        if (obj.method == "POST" && typeof obj.xmlHttpRequest.setRequestHeader != "undefined") {
            obj.xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            obj.xmlHttpRequest.send(obj.queryString);
        } else if (obj.method == "GET")
            obj.xmlHttpRequest.send('');
    };

    obj.handleArguments = function(args) {

        if (typeof args.form == "object" && args.form != null) {
            obj.form = args.form;
            obj.appendForm();
        }
        for (a in args) {
            if (typeof obj[a] == "undefined")
                obj.parameters[a] = args[a]; else {
                if (a != "parameters" && a != "headers")
                    obj[a] = args[a]; else
                    for (b in args[a])
                        obj[a][b] = args[a][b];
            }
        }
        obj.method = obj.method.toUpperCase();
    };

    obj.switchForm = function(enable) {

        if (typeof obj.form != "object" || obj.form == null)
            return;
        with (obj.form)
            for (var nr = 0; nr < elements.length; nr++)
                if (!enable) {
                    if (elements[nr]["disabled"])
                        elements[nr]["_disabled"] = true; else
                        elements[nr]["disabled"] = "disabled";
                } else
                    if (typeof elements[nr]["_disabled"] == "undefined")
                        elements[nr].removeAttribute("disabled");
    };

    obj.appendForm = function() {

        with (obj.form) {
            obj.method = getAttribute("method").toUpperCase();
            obj.url = getAttribute("action");
            for (var nr = 0; nr < elements.length; nr++) {
                var e = elements[nr];
                if (e.disabled)
                    continue;
                switch (e.type) {
                    case "text":
                    case "password":
                    case "hidden":
                    case "textarea":
                        obj.addParameter(e.name, e.value);
                        break;
                    case "select-one":
                        if (e.selectedIndex >= 0)
                            obj.addParameter(e.name, e.options[e.selectedIndex].value);
                        break;
                    case "select-multiple":
                        for (var nr2 = 0; nr2 < e.options.length; nr2++)
                            if (e.options[nr2].selected)
                                obj.addParameter(e.name, e.options[nr2].value);
                        break;
                    case "checkbox":
                    case "radio":
                        if (e.checked)
                            obj.addParameter(e.name, e.value);
                        break;
                }
            }
        }
    };

    obj.addParameter = function(name, value) {
        if (typeof obj.parameters[name] == "undefined")
            obj.parameters[name] = value; else
        if (typeof obj.parameters[name] != "object")
            obj.parameters[name] = [ obj.parameters[name], value ]; else
        obj.parameters[name][obj.parameters[name].length] = value;
    };
    obj.delParameter = function(name) {

        delete obj.parameters[name];
    };
    obj.raiseEvent = function(name) {
        var args = [];
        for (var i = 1; i < arguments.length; i++)
            args.push(arguments[i]);
        if (typeof obj["on" + name] == "function")
            obj["on" + name].apply(null, args);
        if (name == "FatalError")
            obj.raiseEvent("Finalization", obj);
    }

    if (typeof advAJAX._defaultParameters != "undefined")
        obj.handleArguments(advAJAX._defaultParameters);
    return obj;
}

advAJAX.get = function(args) {

    return advAJAX.handleRequest("GET", args);
};

advAJAX.post = function(args) {

    return advAJAX.handleRequest("POST", args);
};

advAJAX.head = function(args) {

    return advAJAX.handleRequest("HEAD", args);
};

advAJAX.submit = function(form, args) {

    if (typeof args == "undefined" || args == null)
        return -1;
    if (typeof form != "object" || form == null)
        return -2;
    var request = new advAJAX();
    args["form"] = form;
    request.handleArguments(args);
    return request.run();
};

advAJAX.assign = function(form, args) {

    if (typeof args == "undefined" || args == null)
        return -1;
    if (typeof form != "object" || form == null)
        return -2;
    if (typeof form["onsubmit"] == "function")
        form["_onsubmit"] = form["onsubmit"];
    form["advajax_args"] = args;
    form["onsubmit"] = function() {
        if (typeof this["_onsubmit"] != "undefined" && this["_onsubmit"]() === false)
            return false;
        if (advAJAX.submit(this, this["advajax_args"]) == false)
            return true;
        return false;
    }
    return true;
};

advAJAX.download = function(targetObj, url) {

    if (typeof targetObj == "string")
        targetObj = document.getElementById(targetObj);
    if (!targetObj)
        return -1;
    advAJAX.get({
        url: url,
        onSuccess : function(obj) {
            targetObj.innerHTML = obj.responseText;
        }
    });
};

advAJAX.scan = function() {

    var obj = document.getElementsByTagName("a");
    for (var i = 0; i < obj.length;) {
        if (obj[i].getAttribute("rel") == "advancedajax" && obj[i].getAttribute("href") !== null) {
            var url = obj[i].getAttribute("href");
            var div = document.createElement("div");
            div.innerHTML = obj[i].innerHTML;
            div.className = obj[i].className;
            var parent = obj[i].parentNode;
            parent.insertBefore(div, obj[i]);
            parent.removeChild(obj[i]);
            advAJAX.download(div, url);
        } else i++;
    }
};

advAJAX.handleRequest = function(requestType, args) {

    if (typeof args == "undefined" || args == null)
        return -1;
    var request = new advAJAX();
    window.advajax_obj = request;
    request.method = requestType;
    request.handleArguments(args);
    return request.run();
};

advAJAX._defaultParameters = new Object();
advAJAX.setDefaultParameters = function(args) {

    advAJAX._defaultParameters = new Object();
    for (a in args)
        advAJAX._defaultParameters[a] = args[a];
};

advAJAX._groupData = new Object();



// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006

// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
// 
// See scriptaculous.js for full license.  

// converts rgb() and #xxx to #xxxxxx format,  
// returns self (or first argument) if not convertable  
String.prototype.parseColor = function() {  
  var color = '#';  
  if(this.slice(0,4) == 'rgb(') {  
    var cols = this.slice(4,this.length-1).split(',');  
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  } else {  
    if(this.slice(0,1) == '#') {  
      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
      if(this.length==7) color = this.toLowerCase();  
    }  
  }  
  return(color.length==7 ? color : (arguments[0] || this));  
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
  element = $(element);  
  Element.setStyle(element, {fontSize: (percent/100) + 'em'});   
  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
}

Element.getOpacity = function(element){  
  var opacity;
  if (opacity = Element.getStyle(element, 'opacity'))  
    return parseFloat(opacity);  
  if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))  
    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
  return 1.0;  
}

Element.setOpacity = function(element, value){  
  element= $(element);  
  if (value == 1){
    Element.setStyle(element, { opacity: 
      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
      0.999999 : 1.0 });
    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
  } else {  
    if(value < 0.00001) value = 0;  
    Element.setStyle(element, {opacity: value});
    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
     Element.setStyle(element, 
       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
                 'alpha(opacity='+value*100+')' });  
  }
}  
 
Element.getInlineOpacity = function(element){  
  return $(element).style.opacity || '';
}  

Element.childrenWithClassName = function(element, className, findFirst) {
  var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { 
    return (c.className && c.className.match(classNameRegExp));
  });
  if(!results) results = [];
  return results;
}

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
  var args = arguments;
  this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[element.visible() ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {}

Effect.Transitions.linear = Prototype.K;

Effect.Transitions.sinoidal = function(pos) {
  return (-Math.cos(pos*Math.PI)/2) + 0.5;
}
Effect.Transitions.reverse  = function(pos) {
  return 1-pos;
}
Effect.Transitions.flicker = function(pos) {
  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
Effect.Transitions.wobble = function(pos) {
  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
Effect.Transitions.pulse = function(pos) {
  return (Math.floor(pos*10) % 2 == 0 ? 
    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
}
Effect.Transitions.none = function(pos) {
  return 0;
}
Effect.Transitions.full = function(pos) {
  return 1;
}

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval) 
      this.interval = setInterval(this.loop.bind(this), 40);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    this.effects.invoke('loop', timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn + (this.options.duration*1000);
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  initialize: function(element, percent) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || {});
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');
    
    this.originalStyle = {};
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));
      
    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;
    
    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if(fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));
    
    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
    
    this.dims = null;
    if(this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if(/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if(!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if(this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = {};
    if(this.options.scaleX) d.width = Math.round(width) + 'px';
    if(this.options.scaleY) d.height = Math.round(height) + 'px';
    if(this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if(this.elementPositioning == 'absolute') {
        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if(this.options.scaleY) d.top = -topd + 'px';
        if(this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {
      backgroundImage: this.element.getStyle('background-image') };
    this.element.setStyle({backgroundImage: 'none'});
    if(!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- combination effects ------------- */



Effect.SlideDown = function(element) {
  element = $(element);
  element.cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.setStyle({height: '0px'});
      effect.element.show(); },
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping(); 
      // IE will crash if child is undoPositioned first
      if(/MSIE/.test(navigator.userAgent) && !window.opera){
        effect.element.undoPositioned();
        effect.element.firstChild.undoPositioned();
      }else{
        effect.element.firstChild.undoPositioned();
        effect.element.undoPositioned();
      }
      effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || {})
  );
}

Effect.SlideUp = function(element) {
  element = $(element);
  element.cleanWhitespace();
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) {
      effect.element.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.show(); },  
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
    afterFinishInternal: function(effect) {
      effect.element.hide();
      effect.element.undoClipping();
      effect.element.firstChild.undoPositioned();
      effect.element.undoPositioned();
      effect.element.setStyle({bottom: oldInnerBottom}); }
   }, arguments[1] || {})
  );
}

Element.Methods.visualEffect = function(element, effect, options) {
  s = effect.gsub(/_/, '-').camelize();
  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
  new Effect[effect_class](element, options);
  return $(element);
};

Element.addMethods();