﻿/*
* 
* 1.0 25.09.2008 Lauris pirmā versija
* 1.1 20.10.2008 Lauris pārlikts no uz jquery
* 1.3 20.10.2008 Lauris papildināts popup algoritms, kas ņem vērā iespēja atvērt bez popup
*
*/
(function($) {
	var INDICATOR = '<img src="/images/wait16.gif" alt="gaidam..." width="16" height="16"  style="vertical-align:middle;visibility:hidden;margin-left:3px"/>'

	$.fn.mTable = function(url, settings) {
		if (typeof url != 'string') { // ja nav iedots url, nobīdam paramtrus
			settings = url;
			url = undefined;
		}
		settings = $.extend({
			// noklusētā tabulas šūnas click darbība
			onaction: function(url, pop) { if (pop) { $.popup(url); } else { document.location = url; } },
			afterUpdate: function() { }, // pēc atjaunosanas iespējams vajag darīt vēl ko
			pagerClass: 'pager',
			tableClass: 'datatable',
			hoverClass: 'hover',
			indicator: undefined,
			indicatorTag: INDICATOR
		}, settings);
		return this.each(function() {
			var loading = false;
			var container = $(this);
			if (!settings.indicator) { // ja nav iedots indikators, iesprauzam paši, pirms tam novācot veco
				settings.indicator = $(settings.indicatorTag).appendTo(container.parent().find(':header').find('img').remove().end())
			}
			if (url) { // ja ir url sākam pieprasīt datus
				container.mload(url, { x: getPartial() }, function() { catchLinks(); }, settings.indicator);
			}
			else {
				catchLinks();
			}
			//
			function clickNavigation() {
				container.mload(this.href, { x: getPartial() }, function() { catchLinks(); }, settings.indicator);
				return false;
			}
			function catchLinks() {
				// pārķēram lappušu linkus un
				// tabulas virsraksta kārtošanas linkus
				// pirms uzlikt click noņemu visus citus click ķērajus (piem no popup)
				container.find('.{0} a'.format(settings.pagerClass)).unbind("click").click(clickNavigation);
				container.find('table.{0} tr th > a'.format(settings.tableClass)).unbind("click").click(clickNavigation);
				// ja rindas pirmajā šūnā ir links tad visām šūnām liekam click
				container.find('table.{0} tr'.format(settings.tableClass))
                        .find('td:eq(0):has(a)')
                        .parent()
                        .find('td').css('cursor', 'pointer').click(clickCell)
                        .end()
                        .hover(function() { $(this).addClass(settings.hoverClass); }, function() { $(this).removeClass(settings.hoverClass); });
				// ja vajag vēl ko darīt pēc atjaunošanas
				settings.afterUpdate.call(container);
			}
			function clickCell(e) {
				var a = $(this).parent().find('td:eq(0)>a')
				var url = a.attr('href');
				var pop = (a.attr('target') == '_blank') ? true : false;
				if (e.target.tagName != 'A' || e.target.href == url) {
					settings.onaction(url, pop);
					return false;
				}
			}
			function getPartial(name) {
				return $(container).attr("id") + ((name) ? '_' + name : '');
			}
		});
	};
	$.fn.mGoodsOptions = function(url, settings) {
		if (typeof url != 'string') {
			settings = url;
			url = undefined;
		}
		settings = $.extend({
			onaction: function(url) { },
			loadingText: 'pieprasām ...',
			selectedClass: 'selected',
			indicator: undefined,
			indicatorTag: INDICATOR
		}, settings);
		return this.each(function() {
			var disabledValues = {};
			var container = $(this);
			if (!settings.indicator) { // ja nav iedots indikators, iesprauzam paši, pirms tam novācot veco
				settings.indicator = $(settings.indicatorTag).appendTo(container.prev(':header').find('img').remove().end())
			}
			if (url) {
				container.mload(url, { x: getPartial() }, function() { catchNames(); }, settings.indicator);
			}
			else {
				catchNames();
			}
			//
			function catchNames() {
				container.find('>ul>li>a').click(clickName); // lai varētu atvēt/aizvērt sekcijas
				container.find('>ul>li>ul').each(function() { catchValues($(this)); });
			}
			function catchValues(ul) {
				ul.find('>li>input:checkbox').click(clickValue); // lai filtrētu vērtības
				ul.mlimitList(); // ierobezojam izlasi
			}
			function clickName() {
				var ul = $(this).parent().find('ul');
				if (ul.length === 0) {
					loadValues(this);
				}
				else {
					ul.toggle();
				}
				return false;
			}
			function clickValue() {
				var url = submitUrl(this.form);
				processAction(url);
				loadDisabled(url);
				// pārveidojam label, kurš nāk pēc input
				$(this).next().toggleClass(settings.selectedClass);
				// <li><a>name</a><ul><li><input/><label/><li></ul></li>
				// li -> ul -> a
				var lis = $(this).parent().parent().parent();
				if (lis.find('input:checked').length !== 0) {
					lis.children('a').addClass(settings.selectedClass);
				}
				else {
					lis.children('a').removeClass(settings.selectedClass);
				}
			}
			function loadValues(a) {
				// ieliekot jaunu tukšu ul tiek bloķēti atkārtoti izsaukumi
				var ul = $(a).parent().append('<ul>{0}</ul>'.format(settings.loadingText)).find('ul');
				ul.mload(a.href, { x: getPartial('values') }, onsucess, settings.indicator);
				function onsucess() {
					catchValues(ul);
					processDisable(ul);
				}
			}
			function loadDisabled(url) {
				$.getJSON(url, { x: getPartial('disabled') }, onsucess);
				function onsucess(json) {
					disabledValues = json.values;
					processDisable(container);
				}
			}
			function getPartial(name) {
				return $(container).attr("id") + ((name) ? '_' + name : '');
			}
			function processDisable(elm) {
				elm.find('input:checkbox').each(function() {
					//this.disabled = disabledValues[this.value] ? true : false;
					if (disabledValues[this.value]) {
						if (!this.disabled) {
							this.disabled = true;
							$(this).parent().find('label[for=' + this.id + ']').addClass('disabled');
						}
					} else {
						if (this.disabled) {
							this.disabled = false;
							$(this).parent().find('label[for=' + this.id + ']').removeClass('disabled');
						}
					}
				});
			}
			function processAction(url) {
				settings.onaction(url.substr(url.lastIndexOf("/")));
			}
			// izveido formas sbmit pieprasījumu
			function submitUrl(form) {
				var url = document.location.pathname;
				if (form) {
					if (form.action !== '') {
						url = form.action;
					}
					url += (url.indexOf('?') !== 0 ? '?' : '&') + $(form).serialize();
				}
				return url;
			}
		});
	};
	$.fn.mGoodsGroups = function(url, settings) {
		if (typeof url != 'string') {
			settings = url;
			url = undefined;
		}
		settings = $.extend({
			onaction: undefined,
			afterUpdate: function() { }, // pēc atjaunosanas iespējams vajag darīt vēl ko
			loadingText: 'pieprasām ...',
			groupsClass: 'groups',
			brandsClass: 'brands',
			namesClass: 'names',
			indicator: undefined,
			indicatorTag: INDICATOR
		}, settings);
		return this.each(function() {
			var container = $(this);
			if (!settings.indicator) { // ja nav iedots indikators, iesprauzam paši, pirms tam novācot veco
				settings.indicator = $(settings.indicatorTag).appendTo(container.prev(':header').find('img').remove().end())
			}
			if (url) {
				container.mload(url, { x: getPartial() }, function() { catchClasses(); }, settings.indicator);
			}
			else {
				catchClasses();
			}
			//
			function clickClass() {
				var ul = $(this).parent().find('ul');
				if (ul.length === 0) { loadClass(this); } else { ul.toggle(); }
				return false;
			}
			function clickGroup() {
				var ul = $(this).parent().find('ul');
				if (ul.length === 0) { loadGroup(this); } else { ul.toggle(); }
				selectNode(this);
				processAction(this.href);
				return false;
			}
			function clickBrand() {
				var ul = $(this).parent().find('ul');
				if (ul.length === 0) { loadBrand(this); } else { if (ul.find('li').length != 0) ul.toggle(); }
				selectNode(this);
				processAction(this.href);
				return false;
			}
			function clickValues() {
				selectNode(this);
				processAction(this.href);
				return false;
			}
			function catchClasses() {
				var classes = container.find('>ul');
				classes.find('>li>a').click(clickClass);
				catchGroups(classes.find('>li>ul'));
				settings.afterUpdate.call(container);
			}
			function catchGroups(groups) {
				groups.find('>li>a').click(clickGroup);
				catchBrands(groups.find('>li>ul'));
			}
			function catchBrands(brands) {
				brands.find('>li>a').click(clickBrand);
				brands.mlimitList(); //  ierobezojam razotaju sarakstu
				catchValues(brands.find('>li>ul'));
			}
			function catchValues(values) {
				if (values.find('li').length != 0) {
					values.find('>li>a').click(clickValues);
					values.mlimitList(); //  ierobezojam modeļu sarakstu
					values.show();
				}
			}
			function loadClass(a) {
				// ieliekot jaunu tukšu ul tiek bloķēti atkārtoti izsaukumi
				var ul = $(a).parent().append('<ul class="{0}">{1}</ul>'
                                .format(settings.groupsClass, settings.loadingText)).find('ul');
				ul.mload(a.href, { x: getPartial('groups') }, onsucess, settings.indicator);
				function onsucess() {
					catchGroups(ul);
					// pirmās grupas  ražotāji vēl nav redzami
					// nekas vēl nav iezīmēts
					ul.find('>li>ul').hide();
					ul.find('a.selected').removeClass('selected');
				}
			}
			function loadGroup(a) {
				// ieliekot jaunu tukšu ul tiek bloķēti atkārtoti izsaukumi
				var ul = $(a).parent().append('<ul class="{0}">{1}</ul>'
                                .format(settings.brandsClass, settings.loadingText)).find('ul');
				ul.mload(a.href, { x: getPartial('brands') }, onsucess, settings.indicator);
				function onsucess() {
					catchBrands(ul);
				}
			}
			function loadBrand(a) {
				// ieliekot jaunu tukšu ul tiek bloķēti atkārtoti izsaukumi
				var ul = $(a).parent().append('<ul class="{0}">{1}</ul>'
                                .format(settings.namesClass, settings.loadingText)).find('ul').hide();
				ul.mload(a.href, { x: getPartial('values') }, onsucess, settings.indicator);
				function onsucess() {
					catchValues(ul);
				}
			}

			function getPartial(name) {
				return $(container).attr("id") + ((name) ? '_' + name : '');
			}
			function selectNode(a) {
				container.find('a').removeClass('selected');
				$(a).parents('li').find('a:first').addClass('selected');
			}
			function processAction(url) {
				if (settings.onaction) { settings.onaction(url.substr(url.lastIndexOf("/"))); }
			}
		});
	};
	/*
	$.mlimitList(settings)
	Ja ir sekojoša elementu secība un li skaits pārsniedz [showMax] + [tolerace], tad
	li skaits tiek samazināts līdz showMax un beigās pielikts li a.expand [infoText] span.count
	<ul>
	<a>Virsraksta teksts<span class="count">(123)</span>
	<li>Rindas teksts 1</li>
	<li>Rindas teksts 2</li>
	<li>Rindas teksts 3</li>
	<ul>
	*/
	$.fn.mlimitList = function(settings) {
		settings = jQuery.extend({
			showMax: 5, // maksimālais elementu skaits ierobezotā ul
			tolerance: 2, // pielaide, kurā iekļaujoties  tomēr neslēpjam
			infoText: '... vēl citi', // teksts, kurš parādīsies beigās
			countClass: 'count', // span kalse, kuras iekšpusē ir cipars iekavās, piem: (123)
			selectedClass: 'selected', // a klase, kura simbolizē iezīmētus elementus
			expandClass: 'expand' // a klase, kura simbolizē elementu, kurš parāda visu sarakstu
		}, settings);
		return this.each(function() {
			// meklējam pirmā līmeņa li [a vai label vai ...] span.count
			var spans = $(this).find('>li>*>span.' + settings.countClass);
			// ja skaitts par lielu
			if (spans.length > (settings.showMax + settings.tolerance)) {
				var a = getArray(spans); // izveidojam dilstošu skaitu masīvu
				var c = a[settings.showMax - 1]; // paņemam pēdējo parādāmo vērtību
				var i = 0; // jau parādīto vērtību skaitītājs
				// pa visiem span elementiem un paslēpj to saturošo li,
				// ja pieņem kas secība ir ul li a span.count
				// ja ietverošais a ir ar klasi selected, tad neslēpjam un arī neskaitam
				spans.each(function() {
					spn = $(this);
					if ((getNumber(spn.text()) >= c) && (i < settings.showMax)) {
						i++; // vēl vienu atstājām redzamu
					}
					else if (!spn.parent().hasClass(settings.selectedClass)) {
						spn.parent().parent().hide();
					}
				});
				createShowMore($(this), a.length - settings.showMax);
			}
		});
		// saņem jQuery izlasi ar span elementiem, kuri satur skaitus un
		// izveido dilstošas secības masīvu ar skaitiem
		function getArray(spans) {
			var a = []; // uztaisam skaitu masīvu un piepildam no spans.count
			spans.each(function() { a.push(getNumber($(this).text())); });
			a.sort(function(a, b) { return (b - a); }); // sakārtojam to otrādi
			return a;
		}
		// pārveido no span dabūto tekstu formātā '(123)' par skaitli 123
		function getNumber(text) {
			return parseInt(text.substring(1, text.length - 1), 10);
		}
		// pievienu ul vēl vienu tādu pašu li, uz kura noklikšķinot visi li atveras, bet pats pazūdu
		function createShowMore(ul, num) {
			$(ul).append(
                '<li><a href="" class="{0}">{1} <span class="{2}">({3})</span></a></li>'
                .format(settings.expandClass, settings.infoText, settings.countClass, num))
                .find('li:last').click(function() {
                	$(ul).find('>li').show();
                	$(this).remove();
                	return false;
                });
		}
	};
	//
	$.fn.mload = function(url, data, callback, indicator) {
		callback = callback || function() { };
		if (data && $.isFunction(data)) {
			indicator = callback;
			callback = data;
			data = null;
		}
		var self = this;
		$.ajax({
			url: url,
			data: data,
			indicator: indicator,
			type: 'GET',
			dataType: "html",
			complete: function(XHR, textStatus) {
				if (textStatus == "success" || textStatus == "notmodified") {
					self.html(XHR.responseText.replace(/^\s+|\s+$/g, ''));
					self.each(callback, [XHR.responseText, textStatus, XHR]);
				}
			},
			error: function(XHR, textStatus, errorThrown) {
				self.html('Negaidīts rezultāts: {0} {1}<br/><a href="{2}">{2}</a><br/>{3}'
                                .format(XHR.status, XHR.statusText, url, XHR.responseText));
			}
		});
		return this;
	};
	$.fn.mpost = function(url, data, callback, indicator) {
		callback = callback || function() { };
		if (data && $.isFunction(data)) {
			indicator = callback;
			callback = data;
			data = null;
		}
		var self = this;
		$.ajax({
			url: url,
			data: data,
			type: "POST",
			dataType: "html",
			indicator: indicator,
			complete: function(XHR, textStatus) {
				if (textStatus == "success" || textStatus == "notmodified") {
					self.html(XHR.responseText);
					self.each(callback, [XHR.responseText, textStatus, XHR]);
				}
			},
			error: function(XHR, textStatus, errorThrown) {
				self.html('Negaidīts rezultāts: {0} {1}<br/><a href="{2}">{2}</a>'
                                            .format(XHR.status, XHR.statusText, url));
			}
		});
		return this;
	};
	// catch ajax
	var _ajax = $.ajax;
	$.ajax = function(options) {
		// saglabaju orginālus        
		var _beforeSend = options.beforeSend;
		options.beforeSend = function(XHR) {
			if (options.indicator) { $(options.indicator).css('visibility', 'visible'); }
			if (_beforeSend) { _beforeSend(XHR); }
		};
		var _complete = options.complete;
		options.complete = function(XHR, textStatus) {
			if (options.indicator) { $(options.indicator).css('visibility', 'hidden'); }
			if (_complete) { _complete(XHR, textStatus); }
		};
		var _error = options.error;
		options.error = function(XHR, textStatus, errorThrown) {
			if (XHR.status == 403) {
				document.location = '/login.asp?r={0}'
                            .format(encodeURIComponent(options.url.substring(options.url.lastIndexOf('/'))));
			}
			else if (_error) {
				_error(XHR, textStatus, errorThrown);
			}
			else {
				alert('Pieprasījums: {0}\nIzpildes statuss: {1}\nDatu veids: {2}\nAtbildes statuss: {3}\nDati(<500): {4}'
                            .format(options.url, textStatus, XHR.getResponseHeader('Content-Type'), XHR.status, XHR.responseText.substring(0, 500)));
			}
		};
		// pēc noklusēsnas nelietoju globālos
		options = $.extend({ global: false }, options);
		_ajax(options);
	};
	//
	var _pops = {};
	$.popup = function(url, settings) {
		settings = $.extend({
			height: 550,
			width: 800,
			top1: 120,
			left1: 120,
			topN: 20,
			leftN: 20,
			scrollbars: 'yes',
			resizable: 'yes'
		}, settings);
		if (!_pops.length) {
			$(window).unload(function() { for (url in _pops) { if (!_pops[url].closed) { _pops[url].close(); } } });
		}
		if (!_pops[url] || _pops[url].closed) {
			/*
			var top = window.screenTop || window.screenY || 0;
			var left = window.screenLeft || window.screenX || 0;
			*/
			if (!window.opener) {
				var w = document.body.clientWidth || window.innerWidth;
				var h = document.body.clientHeight || window.innerHeight;
				var left = parseInt((w - settings.width) / 2);
				var top = parseInt((h - settings.height) / 2);

				var left = (window.screen.width - settings.width) / 2;
				var top = (window.screen.height - settings.height) / 2;

			}  else {
				var top = window.screenTop || window.screenY;
				var left = window.screenLeft || window.screenX;
				top += settings.topN;
				left += settings.leftN;
			}
			/*
			if (!window.opener) {
			top += settings.top1;
			left += settings.left1;
			} else {
			top += settings.topN;
			left += settings.leftN;
			}
			*/
			var options = 'height={0},width={1},top={2},left={3},scrollbars={4},resizable={5}'
                .format(settings.height, settings.width, top, left, settings.scrollbars, settings.resizable);
			var name = 'popup{0}'.format(Math.floor(Math.random() * 10000).toString());
			_pops[url] = window.open(url, name, options);
			if (!_pops[url]) {
				main.location = url;  // ja neizdevās atvērt tad pārejam šājā dokumentā
			} else if (!_pops[url].opener) {
				_pops[url].opener = self; // ja nav opener tad iedodam
			}
			if (window.focus && _pops[url]) { _pops[url].focus(); }
		}
	};
	// ja logs ir liels neuzskatam to par popup
	if (document.documentElement.clientWidth > 800) {
		window.opener = null;
	}
	// pirms DOM ir ielādēts popup logam mainam stilu
	if (window.opener) {
		$('head').append('<link rel="stylesheet" href="/assets/mdatori-1.45p.css" type="text/css" />');
	}
	$(function() {
		// kad DOM ir ielādēts popup logam pārķeram saites un formas un pozicionējam uz galveno logu
		// linki, kuri ir jaunā jogā atver jaunu popup
		$('a[target=_blank]').not('[href^=http:]').click(function() {
			$.popup(this.href);
			return false;
		});
		if (window.opener) {
			// linki un formas, ja nav jaunā logā atpakaļ uz galveno logu
			$('a[target!=_blank]').click(function() {
				var main = getMain();
				if (main && !main.closed && this.href && this.href.indexOf('javascript') < 0) {
					main.location = this.href;
					return false;
				}
			});
			$('form').submit(function() {
				var main = getMain();
				if (main && !main.closed && this.action) {
					if (main.name) {
						this.target = main.name;
					} else {
						this.target = main.name = 'main{0}'.format(Math.floor(Math.random() * 10000));
					}
					this.submit();
					return false;
				}
			});
		}
		var MAX_STACK = 5;  // cik tad dziļi var būt popup
		function getMain() {  // meklejam galveno logu
			var main = window.opener;
			for (var i = MAX_STACK; i > 0; i--) {
				if (!main.opener) { break; }
				main = main.opener;
			}
			return main;
		}
	});

	/*
	Stylish Select 0.3 - $ plugin to replace a select drop down box with a stylable unordered list
	http://scottdarby.com/

	Copyright (c) 2009 Scott Darby

	Requires: $ 1.3

	Licensed under the GPL license:
	http://www.gnu.org/licenses/gpl.html
	*/

	//utility methods
	$.fn.extend({
		getSetSSValue: function(value) {
			if (value != undefined) {
				//set value and trigger change event
				$(this).val(value).change();
				return this;
			} else {
				return selText = $(this).find(':selected').val();
			}
		},
		resetSS: function() {
			$this = $(this);
			$this.next().remove();
			//unbind all events and redraw
			$this.unbind().sSelect();
		}
	});

	$.fn.mSelect = function(options) {

		return this.each(function() {

			var defaults = {
				defaultText: '...',
				animationSpeed: 0, //set speed of dropdown
				ddMaxHeight: '' //set css max-height value of dropdown
			};

			//initial variables
			var opts = $.extend(defaults, options),
				$input = $(this),
				$containerDivText = $('<div class="selectedTxt"></div>'),
				$containerDiv = $('<div class="newListSelected" tabindex="0"></div>'),
				$newUl = $('<ul class="newList"></ul>'),
				itemIndex = -1,
				currentIndex = -1,
				keys = [],
				prevKey = false,
				newListItems = '',
				prevented = false;

			//build new list
			$containerDiv.insertAfter($input);
			$containerDivText.prependTo($containerDiv);
			$newUl.appendTo($containerDiv);
			$input.hide();

			//test for optgroup
			if ($input.children('optgroup').length == 0) {
				$input.children().each(function(i) {
					var option = $(this).text();
					//add first letter of each word to array
					keys.push(option.charAt(0).toLowerCase());
					if ($(this).attr('selected') == true) {
						opts.defaultText = option;
						currentIndex = i;
					}
					var className = $(this).attr('class');
					newListItems += '<li' + ((className) ? ' class="' + className + '"' : '') + '>' + option + '</li>';
				});
				//add new list items to ul
				$newUl.html(newListItems);
				newListItems = '';
				//cache list items object
				var $newLi = $newUl.children();

			} else { //optgroup
				$input.children('optgroup').each(function(i) {

					var optionTitle = $(this).attr('label'),
						$optGroup = $('<li class="newListOptionTitle">' + optionTitle + '</li>');

					$optGroup.appendTo($newUl);

					var $optGroupList = $('<ul></ul>');

					$optGroupList.appendTo($optGroup);

					$(this).children().each(function() {
						++itemIndex;
						var option = $(this).text();
						//add first letter of each word to array
						keys.push(option.charAt(0).toLowerCase());
						if ($(this).attr('selected') == true) {
							opts.defaultText = option;
							currentIndex = itemIndex;
						}
						newListItems += '<li>' + option + '</li>';
					})
					//add new list items to ul
					$optGroupList.html(newListItems);
					newListItems = '';
				});
				//cache list items object
				var $newLi = $newUl.find('ul li');

			}

			//get heights of new elements for use later
			var newUlHeight = $newUl.height() + 3,
				containerHeight = $containerDiv.height() + 3,
				newLiLength = $newLi.length;

			//check if a value is selected
			if (currentIndex != -1) {
				navigateList(currentIndex, true);
			} else {
				//set placeholder text
				$containerDivText.text(opts.defaultText);
			}

			//decide if to place the new list above or below the drop-down
			function newUlPos() {
				var containerPosY = $containerDiv.offset().top,
					docHeight = jQuery(window).height(),
					scrollTop = jQuery(window).scrollTop();

				//if height of list is greater then max height, set list height to max height value
				if (newUlHeight > parseInt(opts.ddMaxHeight)) {
					newUlHeight = parseInt(opts.ddMaxHeight);
				}

				containerPosY = containerPosY - scrollTop;
				if (containerPosY + newUlHeight >= docHeight) {
					$newUl.css({ top: '-' + newUlHeight + 'px', height: newUlHeight });
					$input.onTop = true;
				} else {
					$newUl.css({ top: containerHeight + 'px', height: newUlHeight });
					$input.onTop = false;
				}
			}

			//run function on page load
			newUlPos();

			//run function on browser window resize
			$(window).resize(function() {
				newUlPos();
			});

			$(window).scroll(function() {
				newUlPos();
			});

			//positioning
			function positionFix() {
				$containerDiv.css('position', 'relative');
			}

			function positionHideFix() {
				$containerDiv.css('position', 'static');
			}

			$containerDivText.click(function() {

				if ($newUl.is(':visible')) {
					$newUl.hide();
					positionHideFix()
					return false;
				}

				$containerDiv.focus();

				//show list
				$newUl.slideDown(opts.animationSpeed);
				positionFix();
				//scroll list to selected item
				$newUl.scrollTop($input.liOffsetTop);

			});

			$newLi.hover(
			  function(e) {
			  	var $hoveredLi = $(e.target);
			  	$hoveredLi.addClass('newListHover');
			  },
			  function(e) {
			  	var $hoveredLi = $(e.target);
			  	$hoveredLi.removeClass('newListHover');
			  }
			);

			$newLi.click(function(e) {
				var $clickedLi = $(e.target);
				//update counter
				currentIndex = $newLi.index($clickedLi);
				//remove all hilites, then add hilite to selected item
				prevented = true;
				navigateList(currentIndex);
				$newUl.hide();
				$containerDiv.css('position', 'static'); //ie
			});

			function navigateList(currentIndex, init) {

				//get offsets
				var containerOffsetTop = $containerDiv.offset().top,
					liOffsetTop = $newLi.eq(currentIndex).offset().top,
					ulScrollTop = $newUl.scrollTop();

				//get distance of current li from top of list				
				if ($input.onTop == true) {
					//if list is above select box, add max height value
					$input.liOffsetTop = (((liOffsetTop - containerOffsetTop) - containerHeight) + ulScrollTop) + parseInt(opts.ddMaxHeight);
				} else {
					$input.liOffsetTop = ((liOffsetTop - containerOffsetTop) - containerHeight) + ulScrollTop;
				}

				//scroll list to focus on current item
				$newUl.scrollTop($input.liOffsetTop);

				$newLi.removeClass('hiLite')
					.eq(currentIndex)
					.addClass('hiLite');
				var text = $newLi.eq(currentIndex).text();
				var className = $($input.find('option')[currentIndex]).attr('class');
				//page load
				if (init == true) {
					$input.val(text);
					$containerDivText.text(text).attr('class', className);
					return false;
				}
				$input.val(text).change();
				$containerDivText.text(text).attr('class', className);

			};

			$input.change(function(event) {
				$targetInput = $(event.target);
				//stop change function from firing 
				if (prevented == true) {
					prevented = false;
					return false;
				}
				$currentOpt = $targetInput.find(':selected');
				currentIndex = $targetInput.find('option').index($currentOpt);
				navigateList(currentIndex, true);
			}
			);

			//handle up and down keys
			function keyPress(element) {
				//when keys are pressed
				element.onkeydown = function(e) {
					if (e == null) { //ie
						var keycode = event.keyCode;
					} else { //everything else
						var keycode = e.which;
					}

					//prevent change function from firing
					prevented = true;

					switch (keycode) {
						case 40: //down
						case 39: //right
							incrementList();
							return false;
							break;
						case 38: //up
						case 37: //left
							decrementList();
							return false;
							break;
						case 33: //page up
						case 36: //home
							gotoFirst();
							return false;
							break;
						case 34: //page down
						case 35: //end
							gotoLast();
							return false;
							break;
						case 13:
						case 27:
							$newUl.hide();
							positionHideFix();
							return false;
							break;
					}

					//check for keyboard shortcuts
					keyPressed = String.fromCharCode(keycode).toLowerCase();
					var currentKeyIndex = keys.indexOf(keyPressed);
					if (typeof currentKeyIndex != 'undefined') { //if key code found in array
						++currentIndex;
						currentIndex = keys.indexOf(keyPressed, currentIndex); //search array from current index
						if (currentIndex == -1 || currentIndex == null || prevKey != keyPressed) currentIndex = keys.indexOf(keyPressed); //if no entry was found or new key pressed search from start of array
						navigateList(currentIndex);
						//store last key pressed
						prevKey = keyPressed;
						return false;
					}
				}
			}

			function incrementList() {
				if (currentIndex < (newLiLength - 1)) {
					++currentIndex;
					navigateList(currentIndex);
				}
			}

			function decrementList() {
				if (currentIndex > 0) {
					--currentIndex;
					navigateList(currentIndex);
				}
			}

			function gotoFirst() {
				currentIndex = 0;
				navigateList(currentIndex);
			}

			function gotoLast() {
				currentIndex = newLiLength - 1;
				navigateList(currentIndex);
			}

			$containerDiv.click(function() {
				keyPress(this);
			});

			$containerDiv.focus(function() {
				$(this).addClass('newListSelFocus');
				keyPress(this);
			});

			//hide list on blur
			$containerDiv.blur(function() {
				$(this).removeClass('newListSelFocus');
				$newUl.hide();
				positionHideFix();
			});

			//add classes on hover
			$containerDivText.hover(function(e) {
				var $hoveredTxt = $(e.target);
				$hoveredTxt.parent().addClass('newListSelHover');
			},
			  function(e) {
			  	var $hoveredTxt = $(e.target);
			  	$hoveredTxt.parent().removeClass('newListSelHover');
			  }
			);

			//reset left property and hide
			$newUl.css('left', '0').hide();

		});

	};

})(jQuery);

//
String.prototype.format = function() {
    var pattern = /\{\d+\}/g;
    var args = arguments;
    return this.replace(pattern, function(capture) { return args[capture.match(/\d+/)]; });
   };

   function queryString(search) {
   	this.params = new Object()
   	this.get = function(key) {
   		var value = this.params[key];
   		if (value == null) value = Array();
   		return value
   	}
   	var qs = search.substring(1, search.length)
   	if (qs.length == 0) return
   	qs = qs.replace(/\+/g, ' ')
   	var args = qs.split('&')
   	for (var i = 0; i < args.length; i++) {
   		var pair = args[i].split('=')
   		var name = unescape(pair[0])
   		if (pair.length == 2)
   			var value = unescape(pair[1]);
   		if (this.params[name] == null)
   			this.params[name] = [value]
   		else
   			this.params[name].push(value);
   	}
}

//create cross-browser indexOf
Array.prototype.indexOf = function (obj, start) {
	for (var i = (start || 0); i < this.length; i++) {
		if (this[i] == obj) {
			return i;
		}
	}
}


