/* combine : /javascript/common/libraries/jdw_ajax.js*/
$.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 : '',
	closeDefault : '<div class="modalButtonClose modalButtonCloseFooter"><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>',
	backDefault : '<div class="modalButtonBack" id="modalButtonLeft" style="display:none;"><div class="modalButton"><div class="buttonCapLt"></div><a id="modalBackAnchor" href="#" 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, options) {			
			var new_overlay = 0;
			if($('#modal_overlay').size() == 0) {
				$('body').append('<div id="modal_overlay" style="display: none"></div>');
				$('body').append('<div id="modal_coremetrics_node" 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%'});
			
			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'));
		    }
		    
		    if(options && options.height) {
		    	modalDefaults.height = options.height;
		    }if(options && options.width) {
		    	modalDefaults.width = options.width;
		    }
			
			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 backgroundColor = $('#modal_outer').find('#modal_container').css("backgroundColor");
			if($('#modal_outer').find('#modalParam').attr('backgroundColor')) {
				backgroundColor = modalParam.attr('backgroundColor');
		    }
			var border = $('#modal_outer').find('#modal_container').css("border")
			if($('#modal_outer').find('#modalParam').attr('border')) {
				border = modalParam.attr('border');
		    }
			var height = $(document).height();
			$('#modal_overlay').css({'position':'absolute', 'height': height});
			
			var modalContainer = $('#modal_outer').find('#modal_container');
			if ( typeof border != 'undefined' ){
				modalContainer.css({'height': (modalDefaults.height-20) + 'px', 'width': (modalDefaults.width-20) + 'px', 'overflow': overflow, 'backgroundColor': backgroundColor, 'border': border + 'px'});
			} else {
				modalContainer.css({'height': (modalDefaults.height-20) + 'px', 'width': (modalDefaults.width-20) + 'px', 'overflow': overflow, 'backgroundColor': backgroundColor});
			}
			
		}, header :	function (options) {
			
			var hideHeader = options ? options.hideHeader : false;
			if(!hideHeader) {
				if($('#modal_outer').find('#modal_header').size() == 0) {
					if ( typeof modalDefaults.title != 'undefined' ){
						$('#modal_outer').prepend('<div id="modal_header"><p class="title"></p></div>');
					} else {
						$('#modal_outer').prepend('<div id="modal_header"></div>');
					}
					
					if(options && options.closeButtonHeader) {
						$('#modal_header').append('<div class="modalButtonClose"><div class="buttonCapLt"></div><a style="cursor:pointer;">Close this window</a><div class="buttonCapRt"></div></div>');
					}
					
					if ( typeof modalDefaults.title != 'undefined' ){
						$('#modal_outer').find('#modal_header').find('.title').html(modalDefaults.title);
					}
					$('#modal_outer').find('#modal_header').css({'width': (modalDefaults.width-12) + 'px'});
				}	
			}
		}, footer : function(options) {
			
			var hideFooter = options ? options.hideFooter : false;
			if(!hideFooter) {
				modalDefaults.controls = modalFunctions.getModalControls(options);
				
				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 (options) {
			var disableClose = options ? options.disableClose : false;
			if (modalDefaults.overlayClose == 'false' || disableClose) {
				$('.modalButtonClose').hide();
			}
			if(options && !options.closeButtonFooter) {
				$('.modalButtonCloseFooter').hide();
			}
		}, backBtn : function (disableClose, showScrollbars) {
		   	if (modalLinkStack.length > 1 && modalDefaults.backButton=='true'){		   		
		   		var options = {
		   				fromBack: true,
		   				scrollbars: showScrollbars,
		   				closeButtonFooter: !disableClose
		   		};
		   		$('#modalBackAnchor').attr("modalBack", true);
		   		$('#modalBackAnchor').click(function() {
		   			jdwModal.displayModalFromUrl(modalLinkStack[modalLinkStack.length - 2], options);
		   		});
		   		//fade in 
		   		$('.modalButtonBack').show();	  	
  	       } 
		}	
	}, executeModal : function (data, disableClose, showScrollbars, options) {
	    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, options);
						
			modalDefaults.controls = modalFunctions.getModalControls(options);
			
			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();
			}
			
			if(!options || !options.hideFooter) {
				$('#modal_outer').find('#modal_control').html(modalDefaults.controls);
			}
			
			this.create.header(options);
			$('#modal_outer').find('#modal_control').remove();
			this.create.footer(options);
   			this.create.closeBtn(options);
			this.create.backBtn(disableClose, showScrollbars);
		} else {
			this.create.container(data, showScrollbars,options);
			this.create.header(options);
			this.create.footer(options);
			this.create.closeBtn(options);
			
			if (typeof onPCMPage != 'undefined') {
				setTimeout(function() {
					$('#modal_overlay, #modal_outer').animate({opacity: 'show'}, 10, function () {
						$('#modal_overlay').animate({opacity: 0.8}, 350, 'linear', function(){
							$('.modalLoadFocus').first().focus();
							// Amplience workaround, adding a callback function is the long term solution
							$("#fitting").cssDropdown();
							$("#optionColourSelect").cssDropdown();
							$("#optionSizeSelect").cssDropdown();
						});
					}); 
				}, 500);				
			} else {
				setTimeout(function() {
					$('#modal_overlay, #modal_outer').animate({opacity: 'show'}, 10, function () {
						$('#modal_overlay').animate({opacity: 0.8}, 350, 'linear', function(){$('.modalLoadFocus').first().focus();});
					}); 
				}, 500);				
			}	
		}

		
		$('#modal_outer #modal_container').scrollTop(0);
		
		if(options && options.onSuccess) {
			options.onSuccess();
		}

	}, getModalControls : function(options) {

			var continueUrl; 
			var continueText; 
			var nextButton;
			var backButton = modalDefaults.backDefault;;
			var continueButton;
			var closeButton = modalDefaults.closeDefault;
			
			if(options) {
				continueUrl = (options.continueUrl ? options.continueUrl : null);
				continueText = (options.continueText ? options.continueText : 'Continue');		
			
				if(options.backText) {
					backButton = '<div class="modalButtonBack" id="modalButtonLeft" style="display:none;">' +
								 '<div class="modalButton"><div class="buttonCapLt"></div><a id="modalBackAnchor" ' +
								 'href="#" alt="Click to Go Back" title="Click to go back">' + options.backText + '</a>' +
								 '<div class="buttonCapRt"></div></div></div>';
				} 
				
				if(continueUrl) {
					continueButton = '<div class="btn primaryBtn icon-tick" id="modalButtonRight"><div class="modalButton">' +
								 	 '<div class="buttonCapLt"></div><a id="modalContinueAnchor" ' + 
								 	 'onclick="'+ continueUrl + '"' + 
								 	 ' alt="Click to move forward" title="Click to move forward">' + continueText + 
								 	 '</a><div class="buttonCapRt"></div></div></div>';
				}
			
				if(options.closeText) {
					closeButton = '<div class="modalButtonClose" id="modalButtonLeft">' +
								  '<div class="modalButton"><div class="buttonCapLt"></div><a id="modalBackAnchor" ' +
								  'href="#" alt="Click to close" title="Click to close">' + options.closeText + '</a>' +
								  '<div class="buttonCapRt"></div></div></div>';
				} 
			}	
			
			var controls;
			if(backButton)
				controls = backButton;
				
			if(continueButton)
				controls+=continueButton;
			
			if(closeButton)
				controls+=closeButton;
				
			return controls;
	}
}

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, options) {
	reset();	
	if(url)
		updateLinkStack(url, fromBack);   
   	    
    modalFunctions.executeModal(data, disableClose, showScrollbars, options);
    
    return false;
}

var closeModalDuration = 350;
function closeModalJQ() {
	$('#modal_overlay, #modal_outer').animate({opacity:'hide'}, closeModalDuration, function () { $(this).remove(); });
	if (getIEVersionNumber() <= 6) {
		setSelects("visible");
	}
	
	setTimeout(function () {
			if(typeof yourvar != 'undefined' && jdwModalOptions.onClose) {
				jdwModalOptions.onClose();
			}
		
			// clear stored links
			modalLinkStack = [];	
			jdwModalOptions = {};
		}, closeModalDuration + 500);
}

function enableCloseModalJQByClickingOutsideBorder(callBack) {
	/* Close overlay by clicking anywhere outside it's borders do this here so 
	when you close the overlay you go back to the home page. */		
	$('body').on('click', callBack, window.clickAnyWhereClickHandler);
}

function clickAnyWhereClickHandler(e){ 	// Add new event handler
	if($('#modal_overlay').size()!=0 && $(e.target).closest('.orderContainer').length==0){
		$('body').die('click', window.clickAnyWhereClickHandler); // Unbind default event handler defined in jdw_ajax.js
		closeModalJQ();
		//The call back function name is passed in as a string,
		//so the .on() function does not execute with 2 params, but uses 3 params.
		var clickAnyWhereCallBack = e.data;
		if (clickAnyWhereCallBack) {
			eval(clickAnyWhereCallBack + "()");
		}
	}
}

function disableCloseModalJQByClickingOutsideBorder(){
	$('body').die('click', window.clickAnyWhereClickHandler);	
}

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';
}

$(document).on('click', '.modalButtonClose', 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 });
});

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;
	
	// Default blank value of sendMethod to explicitly say 'GET' as a blank value seems to upset the
	// android browser.
	if(!sendMethod) {
		sendMethod = 'GET';
	}
	
	if (beforeSendFunction && beforeSendFunction.hideUpdatingOverlay) {
		createUpdatingOverlay = false;
	}
	
	var options = {
		url: urlString,
		beforeSend: function(data) {
			if (createUpdatingOverlay) {
			    overlay.create({ trigger:triggerData,
			    				 cssStyle:{height:'100%',marginLeft:'0px', marginTop:'0px',width:'100%'}, msg : 'Please Wait'});
			}
			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)) {
				if(onSuccessFunction) {
					onSuccessFunction(data, urlString);
				}
			}
		},
		error: function(data, textStatus, errorThrown) {
			if(onErrorFunction) {
				onErrorFunction(data);
			} else {
				window.location = "/shop/error/handler/ajaxerror.action?status=" + textStatus + "&error=" + errorThrown + "&url=" + urlString;
			}
		},
		type: sendMethod
	};
	
	xhtmlRequest = $.ajax(options);
}

		
/* complete : /javascript/common/libraries/jdw_ajax.js*/


