//
// popup confirm dialog
//
(function ($) {
	//
	// plugin definition
	//
	$.fn.confirm = function (options) {
		// build main options before element iteration
		var opts = $.extend({}, $.fn.confirm.defaults, options);
		var $swf = $('.swf');

		// iterate and reformat each matched element
		return this.each(function () {
			var $this = $(this);
			// build element specific options
			var data = $this.metadata();
			var o = data ? $.extend({}, opts, data) : opts;

			var $form = o.form || $this.find('form'),
			$l = $('<div id="loading">' + o.loading_msg + '<br/><br /><img src=' + o.loadingImage + ' /></div>').appendTo($this), 
			$m = $('.msg', $this), $b, $c, $t;
			if ($m.size() == 0) $m = $('<div class="msg"></div>').appendTo($this)

			$form.submit(function() { if (o.form) activate(); else submit(); return false; });
			$this.dialog({
				bgiframe: true, autoOpen: false, height: o.height, width: o.width, modal: o.modal, resizable: o.resizable,
				buttons: {
					'Proceed...': function () { submit(); return false; },
					Cancel: function () { $(this).dialog('close'); }
				},
				close: function () { $swf.show(); $l.hide(); $m.show();$b.show()
				if (o.hide_form_on_submit) $form.show(); },
				open: function () { $swf.hide(); }
			});
			function submit()
			{
				if (!$form.valid || $form.valid()) {
					$l.show(); $m.hide(); $b.hide();
					if (o.hide_form_on_submit)
						$form.hide();
					$.post($form.attr('action'),  $form.serialize(), function (data) {
						var cont = true;
						if (data.result) {
							if (o.onResult)
								cont = o.onResult(data, $b, $c, $t);
							if (cont) {
								$m.text(o.success_msg);
								$c.text(o.c_on_finish);
							}
						}
						if (cont) {
							$l.hide(); $m.show();
							if (o.hide_form_on_submit)
								$form.show(); 
						}
						return false;
					});
				}
				return false;
			}
			function activate()
			{
				$b = $b || $this.parent().find('.ui-dialog-buttonpane button:contains("Proceed...")');
				$c = $c || $this.parent().find('.ui-dialog-buttonpane button:contains("Cancel")');
				$t = $t || $this.parent().find('#ui-dialog-title-confirmDlg'),
				$b.text(o.b).show();
				$c.text(o.c).show(); 
				$l.hide();//$m.text(o.message);
				$this.dialog('open'); 
			}
			$(o.activator).click(function () { activate(); return false;});

		});
	};

	// plugin defaults
	//
	$.fn.confirm.defaults = {
		height: 180, width: 364, modal:true, resizable:false, message: '', success_msg: '', loading_msg:'Processing...',
		b:'Proceed...', b_on_finish: 'Close', c:'Cancel', c_on_finish: 'Close', hide_form_on_submit: false,
		loadingImage:'/Content/Default/Images/loading.gif'
	};

})(jQuery);	

//
// Popup Editor
//
(function ($) {

	$.fn.popupEditor = function (options) {
		var opts = $.extend({}, $.fn.popupEditor.defaults, options);
		return this.each(function () {
			var $collection = $(this), 
				 data = $collection.metadata(), 
				 o = data ? $.extend({}, opts, data) : opts,
				 $dl = $('<div id=' + o.id + ' title=""><div id="content"></div><div id="loading">Loading...<br/><br /><img src=' + o.loadingImage + ' /></div></div>').appendTo(document.body), 
				 $dlc = $('#content', $dl), $loading = $('#loading', $dl), $swf = $('.swf'),
				 dopts = $.extend({}, $.fn.popupEditor.defaults.dialogOptions, o.dialogOptions);
				 dopts = $.extend({}, dopts, {close : function() {$dlc.html(''); if (!o.ignoreSwf) $swf.show();}});
				
			$dl.dialog(dopts); 

			var $dlg = $dl.parent(), 
				 $title = $dlg.find('#ui-dialog-title-' + o.id),
				 $bp = $dlg.find('.ui-dialog-buttonpane'),
				 $buttons = {};

				 $buttons.update = $bp.find('button:contains("Update")');
				 $buttons.del = $bp.find('button:contains("Delete")');
				 $buttons.cancel = $bp.find('button:contains("Cancel")');
				 
			activateButtons();

			function activateButtons() {

				if (o.activationButtons.add)
				{
					$(o.activationButtons.add).click(function (ev) {
						ev.preventDefault();
						onAddClick($(this));
						return false;
					});
				}
				if (o.activationButtons.edit)
				{
					$(o.activationButtons.edit).unbind('click').click(function (ev) {
						ev.preventDefault();
						onEditClick($(this));
						return false;
				});
				}
			};
			
			function onAddClick($btn)
			{
				$buttons.del.hide();
				var $itemContainer = { parent: $(o.itemContainer.parent), 
				                      container:$(o.itemContainer.template)};
											 
				$itemContainer.item = (o.itemContainer.item) ? $itemContainer.container.find(o.itemContainer.item) :
					$itemContainer.container;
					
				var id = $btn.metadata() ? $btn.metadata().id : 0, action = o.addAction ? o.addAction : o.updateAction; 
				opendialog(o.addPrefix, 'Add', id, action.replace('{0}', id), $itemContainer, true);
			}
			
			function onEditClick($btn)
			{
				var id = $btn.metadata() ? $btn.metadata().id : $btn.next('input').val(), 
					//$itemContainer = $this.parents(o.itemContainer.parent); 
				   $itemContainer = { parent: $(o.itemContainer.parent), 
				                      container:$btn.parents(o.itemContainer.container)};
			
				$itemContainer.item = (o.itemContainer.item) ? $itemContainer.container.find(o.itemContainer.item) :
					$itemContainer.container;

				var deleteAction = o.deleteAction.replace('{0}', id); 
				
				if (!o.activationButtons.hideDelete)
					$buttons.del.show().unbind('click').bind("click", (function () {
					
						if (!o.onDeleting || o.onDeleting())
						{
							$buttons.del.hide();
							$buttons.update.hide();
							$.post(deleteAction, null, function (data) {
								if (data && data.result) {
									$itemContainer.parent.trigger('recordDeleted', $itemContainer);
									$itemContainer.container.empty();
									$title.text('Record has been deleted.');
									$buttons.cancel.text('Done!');
									$dlc.find(o.editorForm).submit(function(){});
								}
								if (o.onDeleted)
									o.onDeleted(data, $buttons);
							}, 'json');
						}
						return false;
					}));
				else
					$buttons.del.hide();
			
				opendialog(o.editPrefix, 'Update', id, o.updateAction.replace('{0}', id), $itemContainer, false)

			}
			
			function opendialog(prefix, btext, id, updateAction, $itemContainer, isAdding)
			{
				// Set Dialog Title
				$title.text(prefix + o.title);
				$buttons.update.text(btext);
				$buttons.cancel.text('Cancel');

				// Open Dialog
				$buttons.update.show();
				$buttons.cancel.show();
				if (!o.ignoreSwf) $swf.hide(); 
				$dlc.hide(); $loading.show();
				if(o.onOpen)
					$dl.bind("dialogopen", o.onOpen);
				$dl.dialog('open');
				// Get the content
				$.get(o.getAction.replace('{0}', id),
					function (data) {
						$dlc.html(data); $loading.hide(); $dlc.show();
						var h = $dlc.outerHeight();
						if ($dl.height() > h) {
							$dl.height(h);
						}

						h = $(window).height() - 30;
						if (h > $('body').height())
							$('body').height(h);

						if(o.onLoaded)
							o.onLoaded($dl, $dlc);

						assignEditorSubmit(updateAction, $itemContainer, isAdding, btext);
					});
			}
			
			function assignEditorSubmit(updateAction, $itemContainer, isAdding, btext) {
				var $form = $dlc.find(o.editorForm);
				$buttons.cancel.unbind('click').click(function () { $dl.dialog('close'); return false; });
				$buttons.update.unbind('click').click(function () { $form.submit(); return false; });
				if (updateAction) {
					$form.unbind('submit');
					$form.bind('submit', function () {
						if ($form.valid()) {
							try {
								$buttons.update.hide();
								$buttons.cancel.text('Wait...');

								$.post(updateAction, $form.serialize(), function (data) {
									$buttons.cancel.text('Cancel');
									if (data && o.updateResult == 'html') {
										var $item = $itemContainer.item;
										if (o.updateOnAdded && isAdding) {
											var el = $itemContainer.parent.children($itemContainer.container).eq(0);
											$itemContainer.container.insertBefore(el); 
										}
										$item.html(data);
										$itemContainer.container.find("button").button(); 
									
										$buttons.cancel.text('Done!');
										activateButtons();
									
										$itemContainer.parent.trigger(isAdding ? 'recordAdded' : 'recordUpdated', $itemContainer);
									}
									//if (!isAdding)
									//	$buttons.update.show();

									if (o.onEdited) 
										o.onEdited(data, $buttons, $title, $dl);

								}, o.updateResult);
							}
							catch (ex) { $buttons.cancel.text('Cancel'); }
						}
						return false;
					});
				}
			}
			
		});
	};
	
	$.fn.popupEditor.defaults = {
		ignoreSwf: false,
		addPrefix: 'Add ',
		editPrefix: 'Edit ',
		title:'',
		updateAction:'',
		addAction:'',
		deleteAction:'',
		onEdited:null,
		onDeleted:null,
		onDeleting:null,
		updateOnAdded: true,
		updateResult: 'html',
		loadingImage:'/Content/Default/Images/loading.gif',
		itemContainer: {template:'<div class="item"><div>', item:null, container:'div.item', parent:'dl'},
		activationButtons:{},
		dialogOptions:{ bgiframe: true, autoOpen: false, height: 424, width: 324, modal: true, 
				buttons: { 'Update': function () { }, 'Delete': function () { }, Cancel: function () { } }
			}
	};
})(jQuery);

//
// autocomplete
//
(function ($) {
	//
	// plugin definition
	//
	$.fn.ac = function (options) {
		// build main options before element iteration
		var opts = $.extend({}, $.fn.ac.defaults, options);
		// iterate and reformat each matched element
		return this.each(function () {

			var $this = $(this);
			// build element specific options
			var data = $this.metadata();
			//debug(inspect(data));
			var o = data ? $.extend({}, opts, data) : opts;
			var name = (o.name) ? o.name : $this.text();
			// call our markup function
			var $m = $("<div><div><input type='text'></input><input type='button' title='go'/></div></div>");//$.fn.ac.markup(o);
			var $p = o.use_parent ? $this.parent() : $this;
			$p.empty().append($m).find('div div').watermark({text:o.wm});
			var $b = $p.find('input[type=button]').addClass('ui-icon ui-icon-search').button().removeClass('ui-state-default').attr("disabled", true);
			var fname = o.use_map ? o.map[name].v: name;
			o.response = [];
			var $i = $p.find('input[type=text]');
			$i.autocomplete(
			{
				source: function( request, response ) 
				{
					if (!o.term || (o.term != request.term && (o.response.length > 0 || !request.term.match(new RegExp('^'+o.term, 'gi')))))
					{
						o.term = request.term;
						$.post(o.aca, "pi=0&ps="+o.ps+"&rfilter="+o.rf+"&filter="+o.pf+"&sort="+fname + "&filters[0].name="+ fname + "&filters[0].value1="+request.term,
							function( data ) { 
								o.new_filter = data.filter;
								o.new_sort = (data.sort) ? data.sort : fname;
								o.response = $.map( data.names, function( item ) {
									return { label: item.name, value: item.id }
								})
								$b.attr("disabled", o.response.length == 0);
								response(o.response);
							})
					}
					else
						response(o.response);
				},
				appendTo: $this,
				minLength: 2,
				select: function( event, ui ) {
					//postOnComplete(o, ui.item.value)
					if (o.response && o.response.length > 0)
					{
						if (o.redirect)
							window.location = o.pa+'/'+ui.item.value;
						else
							$.post(o.pa, "pi=0&ps="+o.ps+"&rfilter="+o.rf+"&filter="+o.pf+"&sort="+o.new_sort+ "&filters[0].name="+ o.new_sort + "&filters[0].value1="+ui.item.value, o.ppf?o.ppf:function (data) { if (data && o.updatee) {o.updatee.html(data).trigger('updated')}});
					}
					return false;
				},
				open: function() {
					$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
					$( this.menu ).addClass("combo");
				},
				close: function() {
					$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
					$( this.menu ).removeClass("combo");
				},
				focus: function(event, ui) 
				{ 
					//$i.val(ui.item.label);
					return false;
				}

			}).bind("keypress.autocomplete", function(e) {
									
					if (e.keyCode === 13) 
					{
						postOnComplete(o, $(this).val())
						e.preventDefault();
					}
					else
						$b.attr("disabled", $(this).val().length == 0);

			}).bind("keyup", function(e) {
				$b.attr("disabled", $(this).val().length == 0);
			}).addClass( "ui-corner-all" );
			$b.click(function() {postOnComplete(o, $i.val());return false;} );

			//if (o.wm)
			//$i.watermark('watermark', o.wm);
			
		});
	};

	function postOnComplete(o, val)
	{
		if (o.response && o.response.length > 0)
		{
			if (o.redirect)
				window.location = o.pa+'/-'+$.encodeToHex(val);
			else if (val == o.term)
				$.post(o.pa, "pi=0&ps="+o.ps+"&rfilter="+o.rf+"&filter="+o.new_filter+"&sort="+o.new_sort, o.ppf?o.ppf:function (data) { if (data && o.updatee) {o.updatee.html(data).trigger('updated')}});
			else
				$.post(o.pa, "pi=0&ps="+o.ps+"&rfilter="+o.rf+"&filter="+o.pf+"&sort="+o.new_sort+ "&filters[0].name="+ o.new_sort + "&filters[0].value1="+val, o.ppf?o.ppf:function (data) { if (data && o.updatee) {o.updatee.html(data).trigger('updated')}});
		}
	};

	// plugin defaults
	//
	$.fn.ac.defaults = {
		ps:20, pf:'#', rf:'#', use_parent:true, use_map:false, redirect:false
	};

})(jQuery);	

$.extend({ encodeToHex: function (str) {
    var r="", e=str.length, c=0, h;
    while(c<e){
        h=str.charCodeAt(c++).toString(16);
        while(h.length<2) h="0"+h;
        r+=h;
    }
    return r;
	},
	decodeFromHex: function (str) {
    var r="", e=str.length, s;
    while(e>=2){s=e-2;r=String.fromCharCode("0x0"+str.substring(s,e))+r;e=s;}
    return r;
	}
});

Array.prototype.compare = function(testArr) {
    if (this.length != testArr.length) return false;
    for (var i = 0; i < testArr.length; i++) {
        if (this[i].compare) { 
            if (!this[i].compare(testArr[i])) return false;
        }
        if (this[i] !== testArr[i]) return false;
    }
    return true;
}

function inspect(obj) {
	var s = "InspectObj:";

	if (obj == null) { s = "(null)"; alert(s); return; } 
	else if (obj.constructor == String) { s = "\"" + obj + "\""; } 
	else if (obj.constructor == Array) { s += " _ARRAY"; } 
	else if (typeof (obj) == "function") { s += " [function]" + obj; } 
	else if ((typeof (XMLSerializer) != "undefined") && (obj.constructor == XMLDocument)) {
		s = "[XMLDocument]:\n" + (new XMLSerializer()).serializeToString(obj.firstChild);
		alert(s); return;
	} else if ((obj.constructor == null) && (typeof (obj) == "object") && (obj.xml != null)) {
		s = "[XML]:\n" + obj.xml;
		alert(s); return;
	}
	var i = 3;
	for (p in obj) {
		try {
			l = i > 0 ? ';\t\t' : '\n'; (i == 0) ? i = 3 : i--;
			if (obj[p] == null) {
				s += l + String(p) + " (...)";
			} else if (typeof (obj[p]) == "function") {
				s += l + String(p) + " [function]";
			} else if (obj[p].constructor == Array) {
				s += l + String(p) + " [ARRAY]: " + obj[p];
				for (n = 0; n < obj[p].length; n++)
					s += l + n + ": " + obj[p][n];
			} else {
				s += l + String(p) + " [" + typeof (obj[p]) + "]: " + obj[p];
			} // if
		} catch (e) { s += e; }
	} // for
	return s;
} // inspectObj

