$.fn.Sleep = function(duration, callback) {
	if(!callback)callback=function(){return false;};
	$(this).animate({dummy:1}, duration, callback);
	return this;
};
	
var modalLinkStack=[];
        
var modalDefaults = {
	delay: 300,
	width : 500,
	height: 300,
	controlsHeight: 50,
	headerHeight: 50,			
	scrollTop: 60,			
	controls : '',
	controlsDefault : '<div class="modalButtonClose"><div class="modalButton"><div class="buttonCapLt"></div><a href="#" alt="Click to close this window" title="Click to close this window">Close this window</a><div class="buttonCapRt"></div></div></div>'+
					  '<div class="modalButtonBack" id="modalButtonLeft" style="display:none;"><div class="modalButton"><div class="buttonCapLt"></div><a id="modalBackAnchor" href="#" rel="modal" alt="Click to Go Back" title="Click to go back">Back</a><div class="buttonCapRt"></div></div></div>',
	overlayClose : 'true', 
	backButton : 'true',
	nonModal: 'false' 
};
			
var modalFunctions = {
	create : {
		container : function (data, showScrollbars) {			
			var new_overlay = 0;
			if($('#modal_overlay').size() == 0) {
				$('body').append('<div id="modal_overlay" style="display: none"></div>');
				$('body').append('<div id="modal_outer" style="display: none"></div>');
				$('#modal_outer').append('<div id="modal_container" class="displayOverlay modal_container">' + data + '</div>');
				var new_overlay = 1;
			} else {
				$('#modal_outer').find('#modal_container').html(data);
			}

			$('#modal_overlay').css({'width':'100%'});

			if($.browser.msie == true) {
				$('#modal_overlay').fadeTo(1, 0.8);
			}
			
			var modalParam = $('#modal_outer').find('#modalParam');
			
			if($('#modal_outer').find('#modalParam').attr('title'))
				modalDefaults.title = modalParam.attr('title');
			if($('#modal_outer').find('#modalParam').attr('overlayClose'))
				modalDefaults.overlayClose = modalParam.attr('overlayClose');
			if($('#modal_outer').find('#modalParam').attr('backButton'))
				modalDefaults.backButton = modalParam.attr('backButton');
			if($('#modal_outer').find('#modalParam').attr('nonModal'))
				modalDefaults.nonModal = modalParam.attr('nonModal');
			if($('#modal_outer').find('#modalParam').attr('width'))	
				modalDefaults.width = modalParam.attr('width');
			if($('#modal_outer').find('#modalParam').attr('height'))
				modalDefaults.height = modalParam.attr('height');
			if($('#modal_outer').find('#modalParam').attr('controlsHeight'))
				modalDefaults.controlsHeight = modalParam.attr('controlsHeight');
			if($('#modal_outer').find('#modalParam').attr('scrollTopValue')) {
				modalDefaults.scrollTop = parseInt(modalParam.attr('scrollTopValue'));
		    }
			
			var marginLeft;	
            if($('#modal_outer').find('#modalParam').attr('marginLeft')){
				marginLeft =  parseInt(modalParam.attr('marginLeft'));
			} else {
			  marginLeft = -(modalDefaults.width/2);
			}				
			
			var outerHeight = parseInt(modalDefaults.height) + parseInt(modalDefaults.controlsHeight) + parseInt(modalDefaults.headerHeight);
			
			$('#modal_outer').css({'height': outerHeight + 'px','margin-left' : marginLeft + 'px', 'margin-top' : '-' + (outerHeight/2) + 'px'});
			
			$('#modal_outer').css({'position':'absolute', 'top': ($(window).scrollTop() + modalDefaults.scrollTop)+'px', 'marginTop': '0px'})
			
			var overflow = 'hidden';
			if(showScrollbars) {
			    overflow = 'auto';
			}
			var height = $(document).height();
			$('#modal_overlay').css({'position':'absolute', 'height': height});
			
			if($.browser.msie){
				var modalContainerCSS = $('#modal_outer').find('#modal_container');
				var paddingtop = modalContainerCSS.css('padding-top').split("px")[0];
				var paddingbottom = modalContainerCSS.css('padding-bottom').split("px")[0];
	 		
				modalDefaults.height = parseInt(modalDefaults.height) + parseInt(paddingtop);
			}
			
			$('#modal_outer').find('#modal_container').css({'height': (modalDefaults.height-20) + 'px', 'width': (modalDefaults.width-20) + 'px', 'overflow': overflow});
		}, header :	function () {
			
			if($('#modal_outer').find('#modal_header').size() == 0) {
				$('#modal_outer').prepend('<div id="modal_header"><span class="title"></span></div>');
				
				$('#modal_outer').find('#modal_header').find('.title').html(modalDefaults.title);
				$('#modal_outer').find('#modal_header').css({'width': (modalDefaults.width-12) + 'px'});
			}	
		}, footer : function() {
			
			modalDefaults.controls = modalDefaults.controlsDefault;
			
			if($('#modal_outer').find('#controls').html()) {
				modalDefaults.controls = $('#modal_outer').find('#controls').html();
				$('#modal_outer').find('#controls').remove();
			}
			
			if($('#modal_outer').find('#modal_control').size() == 1)
				$('#modal_outer').find('#modal_control').remove();
			
			$('#modal_outer').append('<div id="modal_control">' + modalDefaults.controls + '</div>');
			$('#modal_outer').find('#modal_control').css({'width': (modalDefaults.width-20) + 'px'});
			
		}, closeBtn : function (disableClose) {
			if (modalDefaults.overlayClose == 'false' || disableClose) {
				$('.modalButtonClose').hide();
			}
		}, backBtn : function () {
		   	if (modalLinkStack.length > 1 && modalDefaults.backButton=='true'){
		   		var backLink = modalLinkStack[modalLinkStack.length - 2];
		   		// add "modalBack" attr to back link to differentiate back link from normal modal links
		   		$('#modalBackAnchor').attr("modalBack","true");
		   		//set href on back link
		   		$('#modalBackAnchor').attr("href",backLink);
		   		//fade in 
		   		$('.modalButtonBack').show();	  	
  	       } 
		}	
	}, executeModal : function (data, disableClose, showScrollbars) {
	    if (getIEVersionNumber() <= 6) {
			setSelects("hidden");
		}
				
		if($('#modal_outer').find('#modal_container').size() == 1) {
			$('#modal_overlay').animate({opacity: 0.7}, 200, function () {
				$('#modal_overlay').animate({opacity: 0.8}, 200);
			});					
			
			this.create.container(data, showScrollbars);
			
			modalDefaults.controls = modalDefaults.controlsDefault;
			
			if($('#modal_outer').find('#modal_container').find('#controls').html()) {
				modalDefaults.controls = $('#modal_outer').find('#modal_container').find('#controls').html();
				$('#modal_outer #modal_container #controls').fadeIn();
			}
			$('#modal_outer').find('#modal_control').html(modalDefaults.controls);
			
			this.create.header();
			$('#modal_outer').find('#modal_control').remove();
			this.create.footer();
   			this.create.closeBtn(disableClose);
			this.create.backBtn();
		} else {
			this.create.container(data, showScrollbars);
			this.create.header();
			this.create.footer();
			this.create.closeBtn(disableClose);
			setTimeout(function() {
				$('#modal_overlay, #modal_outer').animate({opacity: 'show'}, 10, function () {
					$('#modal_overlay').animate({opacity: 0.8}, 350);
				}); 
			}, 500);		
		}
		
		$('#modal_outer #modal_container').scrollTop(0);
	}
}

function getIEVersionNumber() {
	if (/MSIE\s(\d+\.\d+);/.test(navigator.userAgent)) {
   		return new Number(RegExp.$1);
	} else {
   		return 999;
	}
}

function setSelects(visibility) {
    selects = document.getElementsByTagName('select');
    for(i = 0; i < selects.length; i++) {
        selects[i].style.visibility = visibility;
    }
}

function openModalJQ(data, url, fromBack, disableClose,  showScrollbars) {
	reset();	
	if(url)
		updateLinkStack(url, fromBack);   
    // display html content of container DIV in modal window
    
    modalFunctions.executeModal(data, disableClose, showScrollbars);
    
    return false;
}

function closeModalJQ() {
	$('#modal_overlay, #modal_outer').animate({opacity:'hide'}, 350, function () { $(this).remove(); });
	if (getIEVersionNumber() <= 6) {
		setSelects("visible");
	}	
	if($.browser.msie == true) {
		$('body, html').css({'overflow':''});
		$('body, html').attr('style', '');
	}
	// clear stored links
	modalLinkStack = [];	
}

function overlayCloseModalJQ(e) {
	if($('#modal_overlay').size() == 1 && $(e.target).html() == "" && modalDefaults.nonModal == 'true') {
		if($('#modal_outer').css('display') == 'block') {
			closeModalJQ();
		} 
		return false;						
	}	
}			

function updateLinkStack(url,fromBack){
	// if not modal back button
    if (url && !fromBack) {
    	pushLink(url);
    } else if(fromBack) {
    	popLink();
    }
}

function pushLink(url) {		
	//push link onto stack
	if(modalLinkStack.length==0){
	  	modalLinkStack[0] = url;
	}else{
	 	modalLinkStack[modalLinkStack.length] = url;
	}
}

function popLink(){
	//pop link from stack
	modalLinkStack.splice(modalLinkStack.length - 1,1);
}

function reset(){
   	modalDefaults.backButton='true';
   	modalDefaults.overlayClose='true';
   	modalDefaults.nonModal='false';
}

$('.modalButtonClose').live('click', function(event){
	event.preventDefault(); 
	closeModalJQ(); 
	
	var onCloseFunctionName = $(this).attr('onClose');
	if ( onCloseFunctionName ) {
		eval( onCloseFunctionName + '()' );
	}
});

$(window).resize(function(){
		$('#modal_outer, #prodImageZoomify').css({'position':'absolute', 'top': ($(window).scrollTop() + 60)+'px', 'marginTop': '0px'})
		
		var height = $(document).height();
		var width =  $(document).width();
		$('#modal_overlay').css({'position':'absolute', 'height': height, 'width' : width });
});

$('body').live('click', overlayCloseModalJQ);

function checkForRedirect(xmlHttpRequest) {
	var redirectUrl = xmlHttpRequest.getResponseHeader('REDIRECT_URL');
	if (redirectUrl == null || redirectUrl.length == 0) {
		return true;
	} else {
		location.href = redirectUrl;
	}
}

function getUniqueClass(selected) {
   	var uniqueID = new Date().getTime() + "Class";
   	$(selected).addClass(uniqueID);
   	
   	return uniqueID;
}

function ajaxGet(selected, successCallback, url) {
   	
   	if (!url) {
		var url = $(selected).attr('href');
	}
	
	if (!successCallback.hideUpdatingOverlay) {
	    overlay.create({'msg':'Updating', 'showDelay' : 1000, 'trigger': getUniqueClass(selected)});
	}

	var xhtmlRequest = $.get(url, function (data) {
		closedelay = overlay.closeOverlay();
	    if (checkForRedirect(xhtmlRequest)) {
	       successCallback(data);	
	    }
	});	
}

var closedelay;

function performAjaxRequest( urlString, beforeSendFunction, onCompleteFunction, dataType, data,
						onSuccessFunction, onErrorFunction, sendMethod, triggerData, 
						sessionTimeoutFunction ) {
	var xhtmlRequest;
	var createUpdatingOverlay = true;
	
	if (beforeSendFunction && beforeSendFunction.hideUpdatingOverlay) {
		createUpdatingOverlay = false;
	}
	
	var options = {
		url: urlString,
		beforeSend: function(data) {
			if (createUpdatingOverlay) {
			    overlay.create({'msg':'Updating', 'showDelay' : 1000, 'trigger': triggerData});
			}
			if ( dataType ) {
				data.setRequestHeader( 'ajaxDataType', dataType );
			}
			if (beforeSendFunction) {
				var result = beforeSendFunction(data);
				if(result == false) {
					closedelay = overlay.closeOverlay();
				}
					
				return result;
			}
		},
		complete: function(data) {
			closedelay = overlay.closeOverlay();
			if (onCompleteFunction) {
				onCompleteFunction(data);
			}
		},
		dataType: dataType,
		data: data,
		contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
		success: function(data) {
			var dataType = xhtmlRequest.getResponseHeader('ajaxDataType');
			if ( 'json' === dataType ) {
				// For requests that expect a json response, session timeouts can be a problem
				//  since the redirect check below this code will return html.
				if ( data.isSessionTimeout ) {
					if ( sessionTimeoutFunction ) {
						sessionTimeoutFunction( data );
					} else {
						window.location = "/shop/session/timeout/sessionTimeout.action";
					}
					return;
				}
			}
			if (checkForRedirect(xhtmlRequest)) {
				onSuccessFunction(data, urlString);
			}
		},
		error: onErrorFunction,
		type: sendMethod
	};
	
	xhtmlRequest = $.ajax(options);
}

		