﻿/* MKQ 2.0 release */
var Void=function(){};if(!console){var console={log:Void};}

var fixD = function( obj ) {
  return obj.d;
}

JSON.handleError = function( request ) { 
	str = "This is the generic Json.handleError() function. A generic XMLHttpRequest error has occured.\n";
	str += "[ERROR] The XMLHttpRequest has failed!\n";
	var myObj = fixD( JSON.evaluate( request.responseText ) );
	for( var key in myObj ) {
		str += "[" + key + "] " + myObj[key] + "\n";
	}
	Site.ReportError( str );
};

Element.implement({
	findParent: function( className ) {
		var rollbackEle = this;
		while( rollbackEle != null && rollbackEle != document && ! rollbackEle.hasClass( className ) ) {
			rollbackEle = rollbackEle.getParent();
		};
		return rollbackEle;
	},
	selectIndexFromValue: function( val ) {
		if( this.selectedIndex != null ) {
			for( var i = 0; i < this.options.length; i++ ) {
				if( $(this).options[i].value == val || $(this).options[i].innerHTML == val ) {
					this.selectedIndex = i;
					return i;
				}
			}
		}
	},
	getElementsByTagAndAttribute: function( tagName, attributeName, attributeValue ) {
		if( window.webkit || window.ie ) {
			var skipArgumentValue = false;
			if( ! attributeValue ) {
				skipArgumentValue = true;
			}
			var allTags = this.getElements(tagName);
			var returnEle = [];
			allTags.each( function( ele ) {
				if( ele.getAttribute( attributeName ) ) {
					if( ( ele.getAttribute( attributeName ) == attributeValue ) || skipArgumentValue ) {
						returnEle.include( ele );
					}
				}
			});
			return returnEle ;
		} else {
			if( attributeValue ) {
				return this.getElements( tagName + '[' + attributeName + '="' + attributeValue + '"]');
			} else {
				return this.getElements( tagName + '[' + attributeName + ']');
			}
		}
	}
});

Array.implement({
	// returns the element(s) where this.checked is true, returns an item if its 1, or an array if multiple
	
	getChecked: function() {
		var ele = null;
		
		this.each(function(item){
			if( item.checked ) {
				if( ele == null ) {
					ele = item; 
				} else {
					if( $type(ele) == "array" ) {
						ele.push( item );
					} else {
						ele = [ ele, item ];
					}
				}
			}
		});

		return ele;
	}
});

var Hacks = {
	FixAnimatedGifs: function() {
		if(window.ie6) { 
			var fixEles = $$('.fixAnimatedGif');
			fixEles.each(function(ele){
				ele.src = ele.src;
				/*
				var newEle = new Element( "img", {
					'id': ele.getAttribute('id'),
					'class': ele.getAttribute('class'),
					'src': ele.getAttribute('src'),
					'alt': ele.getAttribute('alt')
				});
				var eleParent = ele.getParent();
				eleParent.removeChild( ele );
				eleParent.adopt( ele );
				*/
			});			
		}
	}
};

var Site = {
	WebServices: {
		GetStatesZipByCountryId: '/webservice/Utility.asmx/GetStatesZipByCountryId',
		Log: '/webservice/Utility.asmx/Log',
		GetShippingCosts: '/webservice/Store.asmx/GetShippingCosts',
		GetValuesByFlag: '/webservice/Store.asmx/GetValuesByFlag',
		SetValuesByFlag: '/webservice/Store.asmx/SetValuesByFlag'
	},
	Init: function() { },
	LoadingWindow: {
		Add: function( id ){
			if( ! Site.LoadingWindow.__INIT ) {
				Site.LoadingWindow.__INIT = 1;
				Site.LoadingWindow.__ELEMENTS = [];
				window.addEvent('domready', Site.LoadingWindow.Init);
			};
			
			Site.LoadingWindow.__ELEMENTS.push( id );
			
			if( Site.LoadingWindow.__INIT == 2 ) {
				Site.LoadingWindow.Init();
			}
			
		},
		Init: function() {
			Site.LoadingWindow.__ELEMENTS.each( function( ele ) {
				$(ele).addEvent('click', Lightbox.ShowLoading);
			});
			Site.LoadingWindow.__ELEMENTS = [];
			Site.LoadingWindow.__INIT = 2;
		}
	},
	// TODO: rename this to UpdateShippingCharges
	ShowShippingCosts: {
		Set: function( options ) {
			if( ! Site.ShowShippingCosts.__INIT ) {
				Site.ShowShippingCosts.__INIT = true;
				window.addEvent('domready', Site.ShowShippingCosts.Init );	
			};
			
			Site.ShowShippingCosts.__DROP_DOWN = options.DropDown;
			Site.ShowShippingCosts.__PRODUCT_LIST = options.ProductList;	
		},
		Init: function() {
			if( Site.ShowShippingCosts.__DROP_DOWN != null && Site.ShowShippingCosts.__PRODUCT_LIST ) {
			    
			    //alert(Site.ShowShippingCosts.__DROP_DOWN);
				var dropDownEle = $(Site.ShowShippingCosts.__DROP_DOWN);
				var productListEle = $(Site.ShowShippingCosts.__PRODUCT_LIST);
				
				if( dropDownEle && productListEle ) {
				
					dropDownEle.addEvent( 'change', function() {
						var countryId = this.value;
						
						var UpdateShippingHandling = function( responseText ) {
							var myObj = fixD( JSON.decode( responseText ) );
							
							productListEle.getElements('span.shippingCost').each(function(ele,index){
								ele.set('text', myObj[index] );
							});
						};
						
						var myAjax = new Request({
						    url : Site.WebServices.GetShippingCosts, 
							method : 'post',
							headers : {'Content-Type' : 'application/json'},
							urlEncoded: false,
							onFailure: JSON.handleError,
							onComplete: UpdateShippingHandling
						});
						
						var jsonPost = { CountryId: countryId };

						myAjax.send( JSON.encode( jsonPost ) );
					});
					
				};
			}
		}
	},
	PopupWindow: {
		Options: "status=0,toolbar=0,location=0,menubar=0,resizable=0,scrollbars=1,width=740,height=550",
		Target: "_MKQ_Popup",
		Add: function( id ) {
			if( ! Site.PopupWindow.__INIT ) {
				Site.PopupWindow.__ELEMENTS = [];
				window.addEvent('domready', Site.PopupWindow.Init );
				Site.PopupWindow.__INIT = true;
			}
			Site.PopupWindow.__ELEMENTS.push( id );
		},
		Init: function() {
			Site.PopupWindow.__ELEMENTS.each(function( id ){
				var ele = $(id);
				if( ele ) {
					ele.Url = ele.href;
					ele.addEvent('click', Site.PopupWindow.Show );
				}
			});
		},
		Show: function( e ) {
			var e = new Event(e);
			window.open( this.Url, Site.PopupWindow.Target, Site.PopupWindow.Options );			
			e.stopPropagation();			
			e.stop();
			return false;
		}
	},
	EditableFields: {
		GetJsonWriteEles: function( updateContainer ) {
			var updateEles = [];
			updateEles.combine (
				updateContainer.getElements('[jsonWrite]'),
				updateContainer.getElements('[jsonRequired="true"]')
			);
									
			if( updateEles.length == 0 ) {
				var fixJsonWriteEles = function( tagName ) {
					var allEles = updateContainer.getElements( tagName );
					var returnEles = [];
					allEles.each( function( ele ) {
						if( ele.getAttribute('jsonWrite') || ele.getAttribute('jsonRequired') == 'true' ) {
							returnEles.include( ele );										
						};
					});
					return returnEles;
				};
				
				updateEles.combine( fixJsonWriteEles('select') );
				updateEles.combine( fixJsonWriteEles('input') );
			}
			return updateEles;
		},
		GetJsonReadEles: function() {
		
		},
		Set: function( options ) {
			if( ! Site.EditableFields.__INIT ) {
				Site.EditableFields.__INIT = true;
				window.addEvent('domready', Site.EditableFields.Init );
			};
			
			Site.EditableFields.__CONTAINER = options.Container;
			
		},
		Init: function() { 
			var containerEle = $(Site.EditableFields.__CONTAINER);
			
			if( containerEle ) {
				Site.EditableFields.__BUTTON_CONTAINER = containerEle.getElement('.buttonContainer');	

				var cancelButtonEles = containerEle.getElements('.cancelButton');
				cancelButtonEles.addEvent('click', Site.EditableFields.End );

				/*
				 * this is the update button
				 */
				var updateButtonEles = containerEle.getElements('.updateButton');
				updateButtonEles.addEvent('click', function() {
					var buttonEle = this;
					var updateContainer = this.findParent('editableField');
					if( updateContainer ) {
						updateContainer.addClass('ajaxRequested');
						
						var jsonPost = { 
							fields: {},
							flag: updateContainer.getAttribute('jsonFlag')
						};
						
						var updateEles = Site.EditableFields.GetJsonWriteEles( updateContainer ); 
						
						updateEles.each( function( ele ) {
							if (ele.type == "radio" && ele.checked && ele.value != "") {
								jsonPost.fields[ele.getAttribute('jsonWrite')] = ele.value;
							} else if ( (ele.type != "radio" && ele.value != "" ) || ele.getAttribute("jsonRequired") ) {
								jsonPost.fields[ele.getAttribute('jsonWrite')] = ele.value;
							}
						});			
						
						var myAjax = new Request({
						    url : Site.WebServices.SetValuesByFlag,
							method: 'post',
							headers: { 'Content-type': 'application/json' },
							urlEncoded: false,
							onFailure: JSON.handleError,
							onComplete: function( responseText ) { 
								updateContainer.removeClass('ajaxRequested');
								
								buttonEle.enabled = false;
								
								var myJson = fixD( JSON.decode( responseText ) );
								if( myJson.redirect ) {
										location.href = myJson.redirect;
								} else {
									var flag = updateContainer.getAttribute('jsonFlag');

									if( myJson.error ) {
										Site.EditableFields.ShowErrors( myJson.fields.badFields, myJson.errorMessage, updateContainer );
									} else {
										Site.EditableFields.Update( myJson, updateContainer, flag );
										Site.EditableFields.End();
									}
								}
							}
						});		 
						
						buttonEle.enabled = true;
						
						Site.EditableFields.HideErrors(	updateContainer );

						myAjax.send( JSON.encode( jsonPost ) );
						Hacks.FixAnimatedGifs();
					}
				});
				
				/*
				 * these are the change links that trigger the editable
				 */
				var triggerEles = containerEle.getElements('.editTrigger');
				Site.EditableFields.__TRIGGERS = triggerEles;
				triggerEles.each( function(ele) {
					ele.href = "javascript:Void();";
					ele.addEvent('click', function() {
						if( ! Site.EditableFields.__ACTIVE  ) {			
							var updateContainer = $(this).getParent('.editableField');
							Site.EditableFields.Start( updateContainer );
							updateContainer.addClass('ajaxRequested');
							
							triggerEles.addClass('hidden');
							
							var myAjax = new Request({
							    url : Site.WebServices.GetValuesByFlag, 
								method: 'post',
								headers: { 'Content-type': 'application/json' },
								urlEncoded : false,
								onFailure: JSON.handleError,
								onComplete: function( responseText ) {
									var myJson = fixD( JSON.decode( responseText ) );
									if( myJson.redirect ) {
										location.href = myJson.redirect;
									} else {
										updateContainer.removeClass('ajaxRequested');	
										updateContainer.addClass('editActive');
																				
										var flag = updateContainer.getAttribute('jsonFlag');
										
										if( flag != "paymentType" ) {
											Site.EditableFields.Update( myJson, updateContainer, flag );
										} else {
											var updateEles = Site.EditableFields.GetJsonWriteEles( updateContainer );
																		 
											updateEles.each( function( ele ) { 
												if (ele.get('tag') == "select" ) {
													ele.selectedIndex = 0;
												} else if( ele.type == "radio" || ele.type == "checkbox" ) {
													ele.checked = false;
												} else {
													ele.value = "";
												}
											});
										}
									}
								}
							});
							
							var jsonPost = { 
								flag: updateContainer.getAttribute("jsonFlag")
							};
							
							Site.EditableFields.HideErrors(	updateContainer );								
							
							myAjax.send( JSON.encode( jsonPost ) );
							
							Hacks.FixAnimatedGifs();
						}
					});
				});
			}
		}, /* End of Init */
		HideErrors: function( updateContainer ) {
			var allEles = updateContainer.getElementsByTagAndAttribute('*','jsonWrite');
			allEles.each( function( ele ) { 
				var forAttribute = ( window.ie ) ? 'htmlFor' : 'for';
				var labelEle = updateContainer.getElementsByTagAndAttribute( 'label', forAttribute, ele.id )[0];
				if( labelEle ) {
					labelEle.removeClass('errorMessage');
				}
			});
			var errorMessageEle = updateContainer.getElement('p.errorMessage');
			errorMessageEle.set('text', "");
			errorMessageEle.addClass('hidden');
		},
		ShowErrors: function( fields, errorMessage, updateContainer ) {
			for( var i = 0; i < fields.length; i++ ) {
				var ele = updateContainer.getElementsByTagAndAttribute('*', 'jsonWrite', fields[i] )[0];
				var forAttribute = ( window.ie ) ? 'htmlFor' : 'for';
				var labelEle = updateContainer.getElementsByTagAndAttribute('label', forAttribute, ele.id )[0];
				if( labelEle ){
					labelEle.addClass('errorMessage');
				}
			}
			var errorMessageEle = updateContainer.getElement('p.errorMessage');
			errorMessageEle.set('html', errorMessage );
			errorMessageEle.removeClass('hidden');
		},
		Start: function( updateContainer ) {
			Site.EditableFields.__ACTIVE = updateContainer;		
			
			Site.EditableFields.__BUTTON_CONTAINER.addClass('disabledColorButton');
			Site.EditableFields.__BUTTON_CONTAINER.removeClass('premiumColorButton');
			Site.EditableFields.__BUTTON_CONTAINER.getElements("input").each(function(ele) {
				ele.disabled = true;
			});	
		},
		End: function() {
			if( Site.EditableFields.__ACTIVE  ) {
				Site.EditableFields.__TRIGGERS.removeClass('hidden');
				Site.EditableFields.__ACTIVE .removeClass('editActive');
				Site.EditableFields.__BUTTON_CONTAINER.addClass('premiumColorButton');
				Site.EditableFields.__BUTTON_CONTAINER.removeClass('disabledColorButton');
				Site.EditableFields.__BUTTON_CONTAINER.getElements("input").each(function(ele) {
					ele.disabled = false;
				});
			};
			
			Site.EditableFields.__ACTIVE = null;
		},
		Update: function( myObj, updateContainer, flag ) {
			
			// update the states dropdown first so that we'll be able to select the proper index later
			var stateEle = updateContainer.getElementsByTagAndAttribute( 'select', 'jsonWrite', 'state' )[0];
			if( flag == "membershipTypePayment" ) {
				stateEle = updateContainer.getParent().getElementsByTagAndAttribute( 'select', 'jsonWrite', 'state' )[0];
			}
			
			if( flag == "shippingAddress" && myObj.fields.paymentFields ) { 
				var shippingAddressContainer = updateContainer.getParent().getElementsByTagAndAttribute("*", "jsonFlag", "membershipType");
				if( shippingAddressContainer.length > 0 ) {
					Site.EditableFields.Update( { fields: myObj.fields.paymentFields }, shippingAddressContainer[0], "membershipType" );
				}
			}
			
			// only run this if we have a valid states element (the select box)
			// TODO: i should be passing the div that wraps the input/select
			if( stateEle && myObj.States ) {
				// gotta bind the stateEle so that it updates correctly, meant to be a Ajax callback
				Site.CountryStateSwitcher.UpdateStateEle.bind( { stateEle: stateEle.getParent() }, [ myObj.States ] )();
			}
		
			for( var key in myObj.fields ) { 
				var elesToUpdate = [];
				
				// find the elements we need to get, update both jsonRead and jsonWrite field names
				if( ( key == 'countryId' || key == 'countryName' ) && ( flag == "membershipType" || flag == "membershipTypePayment" ) ) {
//					elesToUpdate.combine( updateContainer.getElements('span.' + key ) );
//					
//					var jsonWriteEle = updateContainer.getParent().getElementsByTagAndAttribute( '*', 'jsonWrite', key );					
//					if( jsonWriteEle ) {
//						elesToUpdate.combine(jsonWriteEle);
//					}
//					
					if( typeof(canadianTaxStmt) != "undefined" && key == "countryName" ) {
						if( myObj.fields[key] == "Canada" ) { 
							$(canadianTaxStmt).removeClass('hidden');
							$(canadianTaxStmt).getParent().getElement('.taxLabel').set('text',"GST");
						} else {
							$(canadianTaxStmt).addClass('hidden');
							$(canadianTaxStmt).getParent().getElement('.taxLabel').set('text',"Tax");
						}
					}
					
				} 
			
				jsonReadEle = updateContainer.getElementsByTagAndAttribute('*', 'jsonRead', key );	
				if (jsonReadEle) {
					elesToUpdate.combine(jsonReadEle);
				}
				
				var jsonWriteEle = updateContainer.getElementsByTagAndAttribute( '*', 'jsonWrite', key );		
				if( jsonWriteEle ) {
					elesToUpdate.combine(jsonWriteEle);
				}
				
				// go through each element and set the value
				elesToUpdate.each( function( ele ) {
					switch( ele.get('tag') ) {
						case "input":
							// remember, checkboxes and radio buttons have checked attribute
							if( ele.type == "radio" || ele.type == "checkbox" ) {
								if( ele.value == myObj.fields[key] ) {
									ele.checked = true;
								}
							} else {
								ele.value = myObj.fields[key];
							}

							break;
						case "select":
							ele.selectIndexFromValue( myObj.fields[key] );
							break;
							
						// this is most likely an HTML element, so just set the text
						default: 
							ele.set('text', myObj.fields[key] );
							break;
					}
				});
			}
		}	
	},
	CountryStateSwitcher: {
		Add: function( options ) {
			if( ! Site.CountryStateSwitcher.__INIT ) {
				window.addEvent('domready', Site.CountryStateSwitcher.Init );
				Site.CountryStateSwitcher.__INIT = true;
				Site.CountryStateSwitcher.__ELEMENTS = [];
			}
			Site.CountryStateSwitcher.__ELEMENTS.push( options );
		},
		Init: function() {
			Site.CountryStateSwitcher.__ELEMENTS.each( function( options ) { 				
				var countryEle = $( options.CountryEle );
				countryEle.stateEle = $(options.StateEle );
				
				countryEle.addEvent('change', function() {
					var myAjax = new Request({ 
					    url : Site.WebServices.GetStatesZipByCountryId,
						method: 'post',
						headers: { 'Content-type': 'application/json' },
						urlEncoded : false,
						onFailure: JSON.handleError,
						onComplete: Site.CountryStateSwitcher.UpdateStateEle.bind( this )
					});

					var jsonPost = { CountryId: this.value };

					myAjax.send( JSON.encode( jsonPost ) );
				});
			
			});
		},
		/*
		 * is a call back function where 'this.stateEle' is the parent DOM element where its 2 children are a select box and input box
		 * this function will check responseObj.States, if its an array, it'll use the select, if its null, it'll show the input
		 */
		UpdateStateEle: function( responseText ) {	
			var responseObj = null;
			
			if( $type(responseText) == "string" ) {
				responseObj = fixD( JSON.decode( responseText ) );
			} else { 
				responseObj = responseText;
			}
			
			var parentEle = this.stateEle.getParent();
			var stateDD = this.stateEle.getElement('select');
			stateDD.empty();
			
			if( responseObj.States ) {				
				if( responseObj.StateLabel ) {
					stateDD.adopt(
						new Element( 'option', {
							'value': 0
						}).set('text', "-- Select  " + responseObj.StateLabel + " --" )
					);
				} else {
					stateDD.adopt(
						new Element( 'option', {
							'value': 0
						}).set('text', "-- Select State --" )
					);
				}
				responseObj.States.each( function( ele ) {
					if( ele.StateName ) {
						stateDD.adopt( 
							new Element( 'option', { 
								'value': ele.StateCode
							}).set('text', ele.StateName )
						);
					}
				});
				
				this.stateEle.getElement('input').addClass('hidden');
				this.stateEle.getElement('select').removeClass('hidden');
				parentEle.getElement('.stateLabel').removeClass('notRequiredField');
				$$('.zipCodeLabel').removeClass('notRequiredField');
			} else {
				this.stateEle.getElement('input').removeClass('hidden');
				this.stateEle.getElement('input').value = "";
				this.stateEle.getElement('select').addClass('hidden');
				parentEle.getElement('.stateLabel').addClass('notRequiredField');
				$$('.zipCodeLabel').addClass('notRequiredField');
			}
			
			if( responseObj.StateLabel ) {
				parentEle.getElement('.stateLabel').set('html', responseObj.StateLabel + '<em class="errorMessage">*</em>' );
			}
			
			var zipEle = parentEle.getElement('div.zipCode input');
			if( zipEle ) {
				zipEle.value = "";
			}
		}
	},
	ReportError: function( message ) {
		var myAjax = new Request({
		    url : Site.WebServices.Log,
			method: 'post',
			headers: { 'Content-type': 'application/json' },
			urlEncoded : false
		});
		
		var jsonPost = {
			'title': 'JavaScript Error',
			'message': message
		};
		
		if( console ) {
			console.log( "[NOTE] Bypassing Event Logger" );
			console.log( jsonPost.title );
			var MessageLine = jsonPost.message.split("\n");
			MessageLine.each( function( item ) {
				console.log( item );
			});
		} else { 
			myAjax.send( JSON.encode( jsonPost ) );
		}
	}
};
var _Debug = {

};

var McK = { 
	NewsletterPicker: {
		Set: function( options ) {
			McK.NewsletterPicker.__CHECKBOX = options.CheckboxId;
			if( ! McK.NewsletterPicker.__INIT ) {
				window.addEvent('domready', McK.NewsletterPicker.Init );
			}
		},	
		Init: function() {
			var mainEle = $(McK.NewsletterPicker.__CHECKBOX);
			if( mainEle ) {
				var otherRadios = mainEle.findParent('monthlyNewsletter').getElements('.emailType input');
				
				otherRadios.each( function( ele ) { 
					ele.disabled = ! mainEle.checked;
				});
				
				mainEle.addEvent('click', function() {
					var found = false;
					otherRadios.each( function( ele, index ) { 
						ele.disabled = ! mainEle.checked;
						if( ele.checked ) {
							found = true;
						}
						
					});
					if( ! found ) {
						otherRadios[0].checked = true;
					}
				});
			};
		}	
	}
};

function execComplete(event, buttonId) 
{   
    if (event.keyCode == 13 || event.keyCode == 3) {    
        event.cancelBubble = true;
        event.returnValue = false;
	    if( buttonId ){
		    buttonId.click();
	    }
    }
}

window.addEvent('domready', Site.Init );