$clone = function(obj) {
	var key, value, clone;
	clone = {};
	for (key in obj) {
		clone[key] = obj[key];
	}
	return clone;
};

var motorola = {
	controls: {},
	pages: {},
	utils: {
		APPEND_COOKIE: '_'
		},
	swf: {},
	/*expressInstallPath and sAssetsPath are redefined on individual JSP pages*/
	globals: {
		expressInstallPath: "/staticfiles/Admin%20Content/Resources/Support/global/flash/expressInstall.swf",
		sAssetsPath: '/staticfiles/Admin%20Content/Resources/Support/global/flash_content/',
		IsFlashInstalled: false,
		FlashVersion: 8
	},
	fxoptions: {
		duration: 500,
		transition: Fx.Transitions.Sine.easeOut
	},
	quicksort: function(vec, loBound, hiBound, compareFunction) {

		var pivot, loSwap, hiSwap, temp;

		// Two items to sort
		if (hiBound - loBound == 1) {
			if (compareFunction(vec[loBound], vec[hiBound]) > 0) {
				temp = vec[loBound];
				vec[loBound] = vec[hiBound];
				vec[hiBound] = temp;
			}
			return;
		}

		// Three or more items to sort
		pivot = vec[parseInt((loBound + hiBound) / 2)];
		vec[parseInt((loBound + hiBound) / 2)] = vec[loBound];
		vec[loBound] = pivot;
		loSwap = loBound + 1;
		hiSwap = hiBound;

		do {
			// Find the right loSwap
			while (loSwap <= hiSwap && compareFunction(vec[loSwap], pivot) <= 0) {
				loSwap = loSwap + 1;
			}

			// Find the right hiSwap
			while (compareFunction(vec[hiSwap], pivot) > 0) {
				hiSwap = hiSwap - 1;
			}

			// Swap values if loSwap is less than hiSwap
			if (loSwap < hiSwap) {
				temp = vec[loSwap];
				vec[loSwap] = vec[hiSwap];
				vec[hiSwap] = temp;
			}
		} while (loSwap < hiSwap);

		vec[loBound] = vec[hiSwap];
		vec[hiSwap] = pivot;

		// Recursively call function...  the beauty of quicksort

		// 2 or more items in first section		
		if (loBound < hiSwap - 1) {
			motorola.quicksort(vec, loBound, hiSwap - 1, compareFunction);
		}

		// 2 or more items in second section
		if (hiSwap + 1 < hiBound) {
			motorola.quicksort(vec, hiSwap + 1, hiBound, compareFunction);
		}
	}
};

Options.implement({
	setOptions:function() {
		this.options = $merge.run([this.options].extend(arguments));
		if(!this.addEvent) { return this; }
		var optionType;
		for(var option in this.options){
			optionType = $type(this.options[option]);
			if(!(optionType == "function" || optionType == "array") || !(/^on[A-Z]/).test(option)){ continue ;}
			if(optionType == "array"){ 
				this.options[option].each(function(arg) { 
					if($type(arg) == "function"){
						this.addEvent(option,arg);
					}
				},this);
			} else {
				this.addEvent(option,this.options[option]);
			}
			delete this.options[option];
		}
		return this;
	}
});

Fx.CSS.implement({
	search: function(selector){
		var to = {};
		Array.each(document.styleSheets, function(sheet, j){
			try {
				var rules = sheet.rules || sheet.cssRules;
				Array.each(rules, function(rule, i){
					if (!rule.style || !rule.selectorText || !rule.selectorText.test('^' + selector + '$','i')) return;
					Element.Styles.each(function(value, style){
						if (!rule.style[style] || Element.ShortStyles[style]) return;
						value = rule.style[style];
						to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
					});
				});
			} catch (e) { }
		});
		return to;
	}
});

Array.implement({
	forEach: function(fn, bind) {
		var i = this.length;
		if (i > 0) {
			do {
				i = i - 1;
				fn.call(bind, this[i], i, this);
			} while (i);
		}
	},
	extend: function(array){
		var i;
		if (array.length > 0) {
			do {
				i = i - 1;
				this.push(array[i]);
			} while (i);
		}
		return this;
	},
	indexOf: function(item, from) {
		var i = this.length;
		var maxIndex;
		if (i > 0) {
			maxIndex = (from < 0) ? Math.max(0, len + from) : from || 0;
			if (!$defined(from)) {
				from = 0;
			}
			do {
				i = i - 1;
				if (this[i] === item) return i;
			} while (i - from);
		}
		return -1;
	},
	sort: function(compareFcn) {
		if (!compareFcn) {
			compareFcn = function(dataOne,dataTwo) {
				var comparable;
				if (dataOne > dataTwo) {
					comparable = 1;
				} else if (dataOne < dataTwo) {
					comparable = -1;
				} else {
					comparable = 0;
				}
				return comparable;
			};
		}
		motorola.quicksort(this, 0, this.length, compareFcn);
	}
});

String.implement({
	template: function(props) {
    	//moto - fixed path segment space issue
		var regex = /%[^20](\w+)%/g;
		
		var newStr = this.replace(regex,function replacer(mid) {
			var key = mid.substring(1,mid.length-1);
			var value = props[key];
			if (typeof value === 'string') {
				return props[key];
			} else {
				return '';
			}
		});
		return newStr;
	}
});

motorola.utils.PngFix = {
	BLANK_GIF_PATH: '/staticfiles/Admin%20Content/Resources/Support/img/blank.gif',
	fixCount: 0,
	imgLoaded: function(loaded, orig, setDimensions) {
		var src = orig.getProperty('src');
		var width = loaded.width;
		var height = loaded.height;
		if ($defined(setDimensions) && !setDimensions) {
			orig.setProperties({
				'src': motorola.utils.PngFix.BLANK_GIF_PATH
			});
		} else {
			orig.setProperties({
				'src': motorola.utils.PngFix.BLANK_GIF_PATH,
				'width': width,
				'height': height
			});
		}
		orig.setStyles({
			backgroundImage: 'none',
			filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '", sizingMethod="scale")'
		});
	},
	fixBg: function(el) {
		if (Browser.Engine.trident4) {
			var elSrc = el.getStyle('backgroundImage');
			var bgSrc, alphaFilter, method;
			if (elSrc.contains('.png') && !el.retrieve('pngFixed')) {
				motorola.utils.PngFix.fixCount++;
				try {
					bgSrc = elSrc.split('url("')[1].split('")')[0];
				} catch (ex) {
					bgSrc = elSrc.split('url(')[1].split(')')[0];
				}
				el.setStyle('backgroundImage', "url(" + motorola.utils.PngFix.BLANK_GIF_PATH + ")");
				method = 'scale';
				if (el.getStyle('background-repeat') == 'no-repeat') {
					method = 'crop';
				}
				el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + bgSrc + '", sizingMethod="' + method + '")';
				el.store('pngFixed',true);
			}
		}
	},
	fixSrc: function(el,setDimensions) {
		if (Browser.Engine.trident4) {
			var imgSrc = el.getProperty('src');
			if (imgSrc.contains('.png') && !el.retrieve('pngFixed')) {
				motorola.utils.PngFix.fixCount++;
				var img = new Asset.image(imgSrc, {
					'onload': motorola.utils.PngFix.imgLoaded.bindWithEvent(this,[el,setDimensions])
				});
				el.store('pngFixed',true);
			}
		}
	},
	fixAll: function() {
		var pngFix = motorola.utils.PngFix;
		var elements = $$('*');
		var i = elements.length;
		var el;
		do {
			i = i - 1;
			el = elements[i];
			pngFix.fixElement(el);
		} while (i);
	},
	fixClass: function(clazz, filter) {
		var elements;
		var filter = $type(filter) === 'element' ? filter : $(filter);
		if ($defined(filter)) {
			elements = filter.getElements('.' + clazz);
		} else {
			elements = $$('.' + clazz);
		}
		if (filter && filter.hasClass(clazz)) { elements.push(filter); }
		var i = elements.length;
		var el;
		if (i > 0) {
			do {
				i = i - 1;
				el = elements[i];
				motorola.utils.PngFix.fixElement(el);
			} while (i);
		}
	},
	fixTag: function(tag, filter) {
		var elements;
		if ($defined(filter) && $type(filter) === 'element') {
			elements = filter.getElements(tag);
		} else {
			elements = $$(tag);
		}
		var i = elements.length;
		var el;
		if (i > 0) {
			do {
				i = i - 1;
				el = elements[i];
				motorola.utils.PngFix.fixElement(el);
			} while (i);
		}
	},
	fixChildren: function(el,clazz) {
		var childElements, i, childElement, childSelector;
		if (clazz) {
			if (el.hasClass(clazz)) {
				motorola.utils.PngFix.fixElement(el);
			}
			childSelector = '.'.concat(clazz);
		} else {
			motorola.utils.PngFix.fixElement(el);
			childSelector = '*';
		}
		childElements = el.getElements(childSelector);
		i = childElements.length;
		childElement;
		if (i > 0) {
			do {
				i = i - 1;
				motorola.utils.PngFix.fixElement(childElements[i]);
			} while (i);
		}
	},
	fixElement: function(el) {
		switch (el.getTag()) {
			case 'img':
				motorola.utils.PngFix.fixSrc(el);
				break;
			default:
				motorola.utils.PngFix.fixBg(el);
				break;
		}
	},
	fixElements: function(elements) {
		var i = elements.length;
		var element;
		if (i > 0) {
			do {
				i = i - 1;
				motorola.utils.PngFix.fixElement(elements[i]);
			} while (i);
		}
	},
	getFilterSrc: function(el) {
		var filter;
		var src;
		if (Browser.Engine.trident4) {
			filter = el.getStyle('filter');
			if (filter && filter.contains("AlphaImageLoader") && filter.test('src=\".*\"')) {
				filter = filter.substring(filter.indexOf('src="') + 5);
				filter = filter.substring(0,filter.indexOf('"'));
				src = filter;
			}
		}
		return src;
	}
};

var IsFlashInstalledForIE = false;
motorola.utils.setIsFlashInstalled = function() {
	var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0);

	if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-2)) >= motorola.globals.FlashVersion) {
		motorola.globals.IsFlashInstalled = true;
	}
	var isIE = (document.all) ? true : false;
	var isWin = (navigator.userAgent.indexOf("Win") != -1) ? true : false;
	if (isWin && isIE) {
		document.write('<scr'+'ipt language="vbscript"\>\n');
		document.write('on error resume next\n');
		document.write('IsFlashInstalledForIE = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.'+motorola.globals.FlashVersion+'")))\n');
		document.write('</scr'+'ipt\>\n');
		motorola.globals.IsFlashInstalled = IsFlashInstalledForIE;
	}
};
motorola.utils.isFlashInstalled = function() {
	return motorola.globals.IsFlashInstalled;
};
motorola.utils.loadHeader = function() {
	var headerElement = document.getElement('.header');
	if (headerElement && motorola.controls.Header) {
		motorola.globals.Header = new motorola.controls.Header(headerElement);
	}else if (headerElement && motorola.controls.HeaderGlobal) {
		motorola.globals.Header = new motorola.controls.HeaderGlobal(headerElement);		
	}
};
motorola.utils.loadFooter = function() {
	var footerElement = document.getElement('.footer');
	if (footerElement && motorola.controls.Footer) {
		motorola.globals.Footer = new motorola.controls.Footer(footerElement);
	}else{
		footerElement = document.getElement('.footerGlobal');
		if (footerElement && motorola.controls.FooterGlobal) {
			motorola.globals.Footer = new motorola.controls.FooterGlobal(footerElement);
		}
	}
};
motorola.utils.preloadImages = function() {
	$$("img").each(function(image) {
		if (image.getStyle('display') == 'none') {
			var i = new Image();
			i.src = image.getProperty('src');
		}
	});
};
motorola.utils.removeEvents = function(type) {
	this.removeEvents(type);
};
motorola.utils.compareProductData = function(dataOne, dataTwo) {
	var comparable;
	if (dataOne.name > dataTwo.name) {
		comparable = 1;
	} else if (dataOne.name < dataTwo.name) {
		comparable = -1;
	} else {
		comparable = 0;
	}
	return comparable;
};
motorola.utils.storeDropdownValue = function(selectOption, name) {
	var value = selectOption.value;
	var key = name || selectOption.optionElement.getParent().getProperty('name');
	key += motorola.utils.APPEND_COOKIE;
	Cookie.set(key,value);
};
motorola.utils.storeRadioValue = function(e) {
	var radio = e.target.radio;
	var key = radio.getProperty('name');
	var value = radio.getProperty('value');
	key += motorola.utils.APPEND_COOKIE;
	Cookie.set(key,value);
};
motorola.utils.removeRadioValue = function(e) {
	var radio = e.target.radio;
	var key = radio.getProperty('name');
	key += motorola.utils.APPEND_COOKIE;
	cookie.remove(key);
};
motorola.utils.storeCheckedValue = function(e) {
	var check = e.target.check;
	var name = check.getProperty('name');
	name += motorola.utils.APPEND_COOKIE;
	var value = check.getProperty('value');
	var storedValue = Cookie.get(name);
	var values;
	if (storedValue) {
		values = storedValue.split(';');
		if (!values.contains(value)) {
			Cookie.set(name,storedValue + ',' + value);
		}
	} else {
		Cookie.set(name,value);
	}
};
motorola.utils.storeUncheckedValue = function(e) {
	var check = e.target.check;
	var name = check.getProperty('name');
	name += motorola.utils.APPEND_COOKIE;
	var value = check.getProperty('value');
	var storedValue = Cookie.get(name);
	var values, newValue;
	if (storedValue) {
		values = storedValue.split(';');
		if (values.contains(value)) {
			values.remove(value);
		}
		if (values.size > 0) {
			newValue = values.toString();
			Cookie.set(name,newValue);
		} else {
			Cookie.remove(name);
		}
	} else {
		Cookie.remove(name);
	}
};
motorola.utils.storeComparedProduct = function(product) {
	var value = product.productId;
	var name = 'comparedProducts' + motorola.utils.APPEND_COOKIE;
	if (product.category) {
		name = name + product.category;
	}
	var storedValue = Cookie.get(name);
	var values;
	if (storedValue) {
		values = storedValue.split(',');
		if (!values.contains(value)) {
			Cookie.set(name,storedValue + ',' + value);
		}
	} else {
		Cookie.set(name,value);
	}
};
motorola.utils.storeUncomparedProduct = function(product) {
	var value = product.productId;
	var name = 'comparedProducts' + motorola.utils.APPEND_COOKIE;
	if (product.category) {
		name = name + product.category;
	}
	var storedValue = Cookie.get(name);
	var values, newValue;
	if (storedValue) {
		values = storedValue.split(',');
		if (values.contains(value)) {
			values.remove(value);
		}
		if (values.length > 0) {
			newValue = values.toString();
			Cookie.set(name,newValue);
		} else {
			Cookie.remove(name);
		}
	} else {
		Cookie.remove(name);
	}
};
motorola.utils.headerCollapse = function(header) {
	var p = header.getElement('p.open');
	p.removeClass('open').addClass('closed');
	motorola.utils.PngFix.fixChildren(p);
};
motorola.utils.headerExpand = function(header) {
	var p = header.getElement('p.closed');
	p.removeClass('closed').addClass('open');
	motorola.utils.PngFix.fixChildren(p);
};
motorola.utils.stopEvent = function(e) {
	var evt;
	if (e && $type(e) === 'event') {
		evt = new Event(e);
		evt.stop();
	}
};
motorola.utils.autoSizeArrowLink = function(arrowLink) {
	if (!Browser.Engine.trident4) { return; }
	var els = arrowLink.getElements('li a').setStyle('display','inline');
	var largest = 0;
	els.each(function(el) { largest = el.getSize().x + 1 > largest ? el.getSize().x : largest; });
	els.setStyle('display','block');
	if (largest > 0) { arrowLink.getElements('li').setStyle('width',largest); }
}
motorola.utils.generateElementId = function(element) {
	var id = element.get('id');
	if (!id) {
		id = 'motoGeneratedElementId' + element.uid[0];
		element.set('id',id);
	}
	return id;
};
motorola.utils.showContent = function() {
	var mainLoading = $('main-loading');
	if (mainLoading) { mainLoading.setStyle('display','none'); }
	document.getElement('div.wrap').setStyles({'left':'0px'});
	motorola.globals.contentVisible = true;
	fireEvent('contentVisible');
};
motorola.utils.flashEntered = function() {
	window.fireEvent('flashentered');
};
motorola.utils.setupSlider = function(content, openLink, closeLink, shouldToggle) {
	var slider;
	if (content) {
		slider = new Fx.Slide(content,{
			duration: shouldToggle ? motorola.fxoptions.duration : 0,
			onStart: function() {
				if (this.open) { this.closer.fade('out'); this.opener.fade('in'); }
				else { this.closer.fade('in'); this.opener.fade('out'); }
			}
		});
		slider.opener = openLink.addEvent('click',slider.toggle.pass([],slider)).addEvent('click',motorola.utils.stopEvent);
		slider.closer = closeLink.addEvent('click',slider.toggle.pass([],slider)).addEvent('click',motorola.utils.stopEvent);
		slider.hide();
	}
};
motorola.utils.domUpdated = function() {
	$$('#sectionNav li.pill-link, .arrowLink li').each(function(pill) {
		if (!pill.retrieve('updated')) {
			var html = pill.get('html') + '<div>&nbsp;</div>';
			pill.set('html',html);
			pill.store('updated',true);
		}
	});
	var hoverableEvents = motorola.utils.hoverableEvents;
	if (Browser.Engine.trident4) {
		$$('.hoverable').addEvents({
			'mouseenter': hoverableEvents.mouseenter,
			'mouseleave': hoverableEvents.mouseleave,
			'mousedown': hoverableEvents.mousedown,
			'mouseup': hoverableEvents.mouseup
		});
	}
};
window.addEvent('domready', function() {
	if (Browser.Engine.gecko) {
		$(document.body).addClass('ff');
		if (document.getElementsByClassName) { $(document.body).addClass('ff3'); }
	}
	else if (Browser.Engine.webkit) { $(document.body).addClass('saf'); }
	if (Browser.Platform.win) { $(document.body).addClass('win'); }
	else if (Browser.Platform.mac) { $(document.body).addClass('mac'); }
	motorola.utils.loadHeader();
	motorola.utils.loadFooter();
	motorola.utils.hoverableEvents = {
		'mouseenter': function() { this.addClass('hover'); },
		'mouseleave': function() { this.removeClass('hover'); },
		'mousedown': function() { this.addClass('activated'); },
		'mouseup': function() { this.removeClass('activated'); }
	};
	if (Browser.Engine.presto) {
		motorola.utils.preloadImages();
	}

  //setting the 'second' class dynamically to the support left nav bar when present
	var arrLi=$$('#support-nav li.hoverable');
	if (arrLi && arrLi.length>1)
	    arrLi[1].addClass('second');

	var topFaqs = motorola.controls.TopFaqs ? new motorola.controls.TopFaqs() : null;	
	motorola.utils.domUpdated();
});
window.addEvent('load',function() {
	motorola.utils.showContent.delay(1); // added delay to fix a safari bug on the support contact page delay will be browser min
	var url = "" + window.location;
	if (!url.contains('print=true')) {
		motorola.utils.setupSlider($('more-description'),$('expand-description'),$('collapse-description'), true);
		motorola.utils.setupSlider($('more-legal'),$('expand-legal'),$('collapse-legal'), !Browser.Engine.gecko);
	}
	if (!window.dcsMultiTrack) {
		window.dcsMultiTrack = function() {
			var str = $A(arguments).join(",");
			alert(str);
		};
	}
});
motorola.utils.setIsFlashInstalled();
