/*************************************
eyenovate ruleset
*************************************/

var eyenovate = {
	siteroot: '',
	/*************************************
	 Product Picture Tooltip
	*************************************/
	product_tooltip: {
	    init: function() {
            $$('.product_img').each(function(el) {
                eyenovate.product_tooltip.add_tooltip(el);
            });
	    },
	    add_tooltip: function(el) {
	        img = el.src.replace('products/32/','products/300/');
            ptt = new YAHOO.widget.Tooltip(el.id + "_tt", {
               context: el.id,
               text: "<div style=\"width: 302px; height: 302px;\"><img src=\"" + img + "\" /></div>"
            });
	    }
	},
	/*************************************
	Calendar Buttons all ietms of class datefield
	*************************************/
	calendar: {
		init: function(){

			eyenovate.calendar.fieldCal = new YAHOO.widget.Calendar("fieldcal","caldiv");

			var calfields = $$('.datefield');

			calfields._each(function(el){
				YAHOO.util.Event.addListener(el, 'focus', eyenovate.calendar.showFieldCal);
				YAHOO.util.Event.addListener(el, 'blur', eyenovate.calendar.hideFieldCal);
				el.setAttribute('autocomplete', 'off');
			});

			eyenovate.calendar.fieldCal.renderEvent.subscribe(eyenovate.calendar.fieldCalListeners, eyenovate.calendar.fieldCal, true);

			eyenovate.calendar.fieldCal.render();
			eyenovate.calendar.fieldCal.hide();
		},
		fieldCal: null,
		fieldCalHasFocus: false,
		fieldCalListeners: function(){
			YAHOO.util.Event.addListener('caldiv', 'mouseover', eyenovate.calendar.fieldCalFocus);
			YAHOO.util.Event.addListener('caldiv', 'mouseout', eyenovate.calendar.fieldCalBlur);
		},
		fieldCalSelect: function(type,args,obj){

			var dates = args[0];
			var date = dates[0];
			var year = date[0], month = date[1], day = date[2];

			this.value = year + "-" + LZ(month) + "-" + LZ(day);

			eyenovate.calendar.hideFieldCal(null, true);
		},
		fieldCalFocus: function(){
			eyenovate.calendar.fieldCalHasFocus = true;
		},
		fieldCalBlur: function(){
			eyenovate.calendar.fieldCalHasFocus = false;
		},
		showFieldCal: function(){
			eyenovate.calendar.fieldCal.selectEvent.unsubscribe(eyenovate.calendar.fieldCalSelect);
			eyenovate.calendar.fieldCal.selectEvent.subscribe(eyenovate.calendar.fieldCalSelect, this, true);

			var xy = YAHOO.util.Dom.getXY(this);
			var date = this.value;
			/*if (date) {
			    eyenovate.calendar.fieldCal.cfg.setProperty('selected', date);
			    eyenovate.calendar.fieldCal.cfg.setProperty('pagedate', new Date(date), true);
			    eyenovate.calendar.fieldCal.render();
			}*/
			eyenovate.calendar.fieldCal.show();
			xy[1] = xy[1] + 20;
			YAHOO.util.Dom.setXY('caldiv', xy);

		},
		hideFieldCal: function(el, withPregidous){
			if(withPregidous == null) withPregidous = false;

			if(!eyenovate.calendar.fieldCalHasFocus || withPregidous )
				eyenovate.calendar.fieldCal.hide();
		}
	},
	/*************************************
	Product Browser
	*************************************/
	product_browse:{
		options: {callback: null},
		panel: null,
		dSource: null,
		table: null,
		latestSearch: null,
		vendor_id: null,

		init: function(clickCallback){
			if(clickCallback)
				eyenovate.product_browse.options.callback = clickCallback;

			// stup the panel
			eyenovate.product_browse.panel = new YAHOO.widget.Panel("Main Panel", { width:"600px", height: "600px", fixedcenter:true, zindex:4, visible:false, draggable:false, close:true, modal: true } );
			eyenovate.product_browse.panel.setHeader("Find a Product");

			// Setup the body
			var bcontent = new Element('div');
			var bsearchhead	= new Element('div', {style: 'padding-bottom: 1em;'}).update("Search: ");
			var searchField = new Element('input', {type: "text", style: "width: 12em;", id: "bc_prod_search"});
			var tablebox = new Element('div', {id: 'bc_tablecontainer'});
			bsearchhead.insert(searchField);
			bcontent.insert(bsearchhead).insert(tablebox);
			eyenovate.product_browse.panel.setBody(bcontent); // to be the search box

			//Setup the buttons
			eyenovate.product_browse.panel.setFooter("Click a product to add it"); // to be buttons
			// Render the whole thing
			eyenovate.product_browse.panel.render("container");

			// Generate The dataTable
			var DataSource = YAHOO.util.DataSource,
		        DataTable  = YAHOO.widget.DataTable;

			eyenovate.product_browse.dSource = new DataSource(eyenovate.siteroot + '/ajax/product_list_json?');
		    eyenovate.product_browse.dSource.responseType   = DataSource.TYPE_JSON;
		    eyenovate.product_browse.dSource.responseSchema = {
		        resultsList : 'rows',
		        fields      : ['product_p', 'product_name', 'description'],
		        metaFields : { totalRecords: 'totalRecords' }
		    };

			var myTableConfig = {
		        initialRequest         	: 'col=product_name&desc=asc&start=0&count=20',
				sortedBy				: {key:"product_name", dir:YAHOO.widget.DataTable.CLASS_ASC},
				selectionMode			: "single"
		    };

			var myColumnDefs = [
		        {key:"product_name", label:"Product ID", width: '180px' },
		        {key:"description", label:"Description", width: '200px' }
		    ];

			eyenovate.product_browse.table = new DataTable('bc_tablecontainer', myColumnDefs, eyenovate.product_browse.dSource, myTableConfig);

			eyenovate.product_browse.table.onEventSelectRow = function( oArgs ){
				var id = this.getRecord(oArgs.target).getData('product_p');

				if(eyenovate.product_browse.options.callback)
					eyenovate.product_browse.options.callback(id);

				eyenovate.product_browse.hide();
			}

			eyenovate.product_browse.table.subscribe("rowMouseoverEvent", eyenovate.product_browse.table.onEventHighlightRow);
			eyenovate.product_browse.table.subscribe("rowMouseoutEvent", eyenovate.product_browse.table.onEventUnhighlightRow);
			eyenovate.product_browse.table.subscribe("rowClickEvent", eyenovate.product_browse.table.onEventSelectRow);

			/* Filter code */
			var runUpdate = function(){
				if($F('bc_prod_search') == eyenovate.product_browse.latestSearch){
					eyenovate.product_browse.dSource.sendRequest(eyenovate.product_browse.queryString(),
																eyenovate.product_browse.table.onDataReturnInitializeTable,
																eyenovate.product_browse.table);
				}
			};

			var timeFilterUpdate = function(){
					eyenovate.product_browse.latestSearch = $F('bc_prod_search');
					setTimeout( runUpdate, 1000);
			}

			YAHOO.util.Event.addListener($('bc_prod_search'), "keyup", timeFilterUpdate);

		},

		queryString: function(){
				var str = "col=product_name&desc=asc&start=0&count=20" +
				  "&filter=" + $F('bc_prod_search');

				if (eyenovate.product_browse.vendor_id)
				  str += "&vendor_f=" + eyenovate.product_browse.vendor_id;

				return str;
		},

		show: function(vendor_id){
		  if (vendor_id)
		    eyenovate.product_browse.vendor_id = vendor_id;
		  else
		    eyenovate.product_browse.vendor_id = null;

			eyenovate.product_browse.dSource.sendRequest(eyenovate.product_browse.queryString(),
														eyenovate.product_browse.table.onDataReturnInitializeTable,
														eyenovate.product_browse.table);

			if(eyenovate.product_browse.panel){
				eyenovate.product_browse.panel.show();
				$('bc_prod_search').focus();
			}
		},

		hide: function(){
			if(eyenovate.product_browse.panel)
				eyenovate.product_browse.panel.hide();
		},

		itemClicked: function(){

		}
	},

	/*************************************
	Assembly Browser
	*************************************/
	assembly_browse:{
		options: {callback: null},
		panel: null,
		dSource: null,
		table: null,
		latestSearch: null,

		init: function(clickCallback){
			if(clickCallback)
				eyenovate.assembly_browse.options.callback = clickCallback;

			// stup the panel
			eyenovate.assembly_browse.panel = new YAHOO.widget.Panel("Assembly Panel", { width:"600px", height: "600px", fixedcenter:true, zindex:4, visible:false, draggable:false, close:true, modal: true } );
			eyenovate.assembly_browse.panel.setHeader("Find an Assembly");

			// Setup the body
			var bcontent = new Element('div');
			var bsearchhead	= new Element('div', {style: 'padding-bottom: 1em;'}).update("Search: ");
			var searchField = new Element('input', {type: "text", style: "width: 12em;", id: "ab_prod_search"});
			var tablebox = new Element('div', {id: 'ab_tablecontainer'});
			bsearchhead.insert(searchField);
			bcontent.insert(bsearchhead).insert(tablebox);
			eyenovate.assembly_browse.panel.setBody(bcontent); // to be the search box

			//Setup the buttons
			eyenovate.assembly_browse.panel.setFooter("Click a product to add it"); // to be buttons
			// Render the whole thing
			eyenovate.assembly_browse.panel.render("container");

			// Generate The dataTable
			var DataSource = YAHOO.util.DataSource,
		        DataTable  = YAHOO.widget.DataTable;

			eyenovate.assembly_browse.dSource = new DataSource(eyenovate.siteroot + '/ajax/assemblies_list_json?');
		    eyenovate.assembly_browse.dSource.responseType   = DataSource.TYPE_JSON;
		    eyenovate.assembly_browse.dSource.responseSchema = {
		        resultsList : 'rows',
		        fields      : ['id', 'name'],
		        metaFields : { totalRecords: 'totalRecords' }
		    };

			var myTableConfig = {
		        initialRequest         	: 'col=id&desc=asc&start=0&count=20',
				sortedBy				: {key:"id", dir:YAHOO.widget.DataTable.CLASS_ASC},
				selectionMode			: "single"
		    };

			var myColumnDefs = [{key:"name", label:"Assembly Name", width: '350px' }];

			eyenovate.assembly_browse.table = new DataTable('ab_tablecontainer', myColumnDefs, eyenovate.assembly_browse.dSource, myTableConfig);

			eyenovate.assembly_browse.table.onEventSelectRow = function( oArgs ){
				var id = this.getRecord(oArgs.target).getData('id');

				if(eyenovate.assembly_browse.options.callback) {
				  new Ajax.Request(eyenovate.siteroot+"/ajax/assembly_products_json", {
  					method: 'get',
  					parameters: { id: id },
  					onSuccess: function(transport) {
  						products = transport.responseText.evalJSON(true);
  						eyenovate.assembly_browse.options.callback(products);
  					}
  				});
				}

				eyenovate.assembly_browse.hide();
			}

			eyenovate.assembly_browse.table.subscribe("rowMouseoverEvent", eyenovate.assembly_browse.table.onEventHighlightRow);
			eyenovate.assembly_browse.table.subscribe("rowMouseoutEvent", eyenovate.assembly_browse.table.onEventUnhighlightRow);
			eyenovate.assembly_browse.table.subscribe("rowClickEvent", eyenovate.assembly_browse.table.onEventSelectRow);

			/* Filter code */
			var runUpdate = function(){
				if($F('ab_prod_search') == eyenovate.assembly_browse.latestSearch){
					eyenovate.assembly_browse.dSource.sendRequest(eyenovate.assembly_browse.queryString(),
																eyenovate.assembly_browse.table.onDataReturnInitializeTable,
																eyenovate.assembly_browse.table);
				}
			};

			var timeFilterUpdate = function(){
					eyenovate.assembly_browse.latestSearch = $F('ab_prod_search');
					setTimeout( runUpdate, 1000);
			}

			YAHOO.util.Event.addListener($('ab_prod_search'), "keyup", timeFilterUpdate);

		},

		queryString: function(){
				var str = "col=id&desc=asc&start=0&count=20" +
				  "&filter=" + $F('ab_prod_search');

				return str;
		},

		show: function(){
			eyenovate.assembly_browse.dSource.sendRequest(eyenovate.assembly_browse.queryString(),
														eyenovate.assembly_browse.table.onDataReturnInitializeTable,
														eyenovate.assembly_browse.table);

			if(eyenovate.assembly_browse.panel){
				eyenovate.assembly_browse.panel.show();
				$('ab_prod_search').focus();
			}
		},

		hide: function(){
			if(eyenovate.assembly_browse.panel)
				eyenovate.assembly_browse.panel.hide();
		},

		itemClicked: function(){

		}
	},

	/*************************************
	Bar code Scanner Entry
	*************************************/
	bar_code_entry: {
		panel: null,

		init: function(callback) {
			var left = document.viewport.getDimensions().width / 2 - 125 + document.viewport.getScrollOffsets().left;
			var top = document.viewport.getScrollOffsets().top + 300;
			var pan = new YAHOO.widget.Panel("Bar Code Entry", {
				xy: [left, top], width:"250px", text: '', center:true, zindex:4, visible:false, draggable:false, close:true
			});
			pan.setHeader("Bar Code Scan Entry");

			var cont = new Element('div', { style: 'height: 100%; width: 100%; text-align: center;' });
			var bse = new Element('input', { type: 'text', id: 'bar_code', style: 'width: 12em;' });
			cont.update("Barcode: ").insert(bse);

			var subdiv = new Element('div');
			var subbut = new YAHOO.widget.Button({label: "Add Item", id: 'add_item', container: subdiv});

			pan.setBody(cont);
			pan.setFooter(subdiv);
			pan.render("container");
			eyenovate.bar_code_entry.panel = pan;

			subbut.subscribe("click", function() {
				new Ajax.Request(eyenovate.siteroot+"/ajax/bar_code_search", {
					method: 'get',
					parameters: { bar_code: $('bar_code').value },
					onSuccess: function(transport) {
						products = transport.responseText.evalJSON(true);

						if (!products || 1 > products.length) {
							alert("Assembly/Product with Barcode: "+$('bar_code').value+" was not found!");
							$('bar_code').select();
						}
						else {
							callback(products);
							eyenovate.bar_code_entry.hide();
						}
					}
				});
			});
		},

		show: function() {
			eyenovate.bar_code_entry.panel.show();
			$('bar_code').focus();
		},

		hide: function() {
			eyenovate.bar_code_entry.panel.hide();
		}
	},

	/*************************************
	Email Client
	*************************************/
	email: {
		panel: null,

		init: function(){
			// stup the panel
			var left = document.viewport.getDimensions().width / 2 - 300 + document.viewport.getScrollOffsets().left;
			var top = document.viewport.getScrollOffsets().top + 100;
			eyenovate.email.panel = new YAHOO.widget.Panel("Email Panel", { xy: [left, top], width:"600px", text: '', center:true, zindex:4, visible:false, draggable:true, close:true } );
			eyenovate.email.panel.setHeader("Email");

			// setup the display of the dialog
			var econtent = new Element('div', {style: 'height: 100%; width: 100%;'});

			var etobox	= new Element('div');
			var econ		= new Element('input', {type: 'hidden', id: 'diag_email_contact'});
			var even		= new Element('input', {type: 'hidden', id: 'diag_email_vendor'});
			var eto		= new Element('input', {type: 'text', id: 'diag_email_to', style: 'width: 15em;'});
			etobox.update('To: ').insert(eto);
			econtent.insert(econ).insert(even).insert(etobox);

			var utmplbox = new Element('div');
			var utmplsel = new Element('select', {name: "diag_template_name", id: "diag_template_name", style: "width: 30em;"});
			utmplsel.insert(new Element('option', {value: ''}));
			econtent.insert(utmplbox.insert(utmplsel));

			var esubbox	= new Element('div');
			var esub	= new Element('input', {type: 'text', id: 'diag_email_subject', style: 'width: 25em;'});
			esubbox.update('Subject: ').insert(esub);
			econtent.insert(esubbox);

			var econtbox	= new Element('div');
			var econt		= new Element('textarea', {type: 'text', id: 'diag_email_body', style: 'width: 95%; height: 25em;'});
			esubbox.insert(econt);
			econtent.insert(econtbox);

			eyenovate.email.panel.setBody(econtent);

			//Setup the buttons
			var ebc = new Element('div', {style: 'text-align: right;'});
			var esubbut = new YAHOO.widget.Button({label: "Send", id: 'email_send', container: ebc});
			var ecanbut = new YAHOO.widget.Button({label: "Cancel", id: 'email_cancel', container: ebc});
			eyenovate.email.panel.setFooter(ebc); // to be buttons

			eyenovate.email.panel.render("container");

			esubbut.subscribe("click", function(){ eyenovate.email.send_email(); eyenovate.email.panel.hide(); });
			ecanbut.subscribe("click", function(){ eyenovate.email.panel.hide(); });

			// run ajax query to fetch template names
			new Ajax.Request(eyenovate.siteroot + '/ajax/email_template_list_json?start=0&count=100', {
				method: 'get',
				onSuccess: function(transport) {
					var json = transport.responseText.evalJSON(true);
					json['rows'].each(function(val) {
						utmplsel.insert(new Element('option', {value: val.email_template_p}).insert(val.name));
					});
				}
			});

			// hook onto template change to update email
			YAHOO.util.Event.addListener($('diag_template_name'), 'change', function() {
				if ($F('diag_template_name') == '') {
					$('diag_email_subject').value = '';
					$('diag_email_body').value = '';
					return;
				}

				new Ajax.Request(eyenovate.siteroot + "/ajax/email_template_json", {
					method: 'get',
					parameters: {id: $F('diag_template_name'), contact_f: $F('diag_email_contact'), vendor_f: $F('diag_email_vendor')},
					onSuccess: function(transport) {
						var json = transport.responseText.evalJSON(true);
						$('diag_email_subject').value = json.subject;
						$('diag_email_body').value = json.body.split("\\n").join("\n");
					}
				});
			});

		},

		email_vendor: function(vendor_id, recipient, subject, content){
			eyenovate.email.create_email(recipient, subject, content, vendor_id);
		},

		email_contact: function(contact_id, recipient, subject, content){
			eyenovate.email.create_email(recipient, subject, content, null, contact_id);
		},

		create_email: function(recipient, subject, content, vendor_id, contact_id){
			if(!recipient)
				recipient = '';
			if(!subject)
				subject = '';
			if (!content)
				content = '';
			if (!vendor_id)
				vendor_id = '';
			if (!contact_id)
				contact_id = '';

			// init ifnot done
			if(!eyenovate.email.panel)
				eyenovate.email.init();

			$('diag_email_to').value = recipient;
			$('diag_email_subject').value = subject;
			$('diag_email_body').value = content;
			$('diag_email_contact').value = contact_id;
			$('diag_email_vendor').value = vendor_id;
			$('diag_template_name').value = '';

			eyenovate.email.panel.show();
		},

		send_email: function (){
			var url = eyenovate.siteroot + '/ajax/send_email';
			var parms = {recipient: $F('diag_email_to'), subject: $F('diag_email_subject'), body: $F('diag_email_body'),
				contact_f: $F('diag_email_contact'), vendor_f: $F('diag_email_vendor')};
			new Ajax.Request(url, {
				method: 'post',
				onSuccess: function(transport) {

				},
				parameters: parms
			});
		}
	},

	/*** COMMENTS ***/
	comments: {
	  list_field: null,
	  date_element: null,
	  title_field: null,
	  body_field: null,
	  create_link: null,
	  save_link: null,
	  comment_type: null,
	  comment_id: null,
	  comments: [],
	  selected_comment: null,
	  selected_item: null,
	  selected_idx: null,

	  init: function(list, date, title, body, create, save) {
	    this.list_field = list;
	    this.date_element = date;
	    this.title_field = title;
	    this.body_field = body;
	    this.create_link = create;
	    this.save_link = save;

	    YAHOO.util.Event.addListener(this.create_link, 'click',  this.create);
	    YAHOO.util.Event.addListener(this.save_link,   'click',  this.save);
	    YAHOO.util.Event.addListener(this.list_field,  'change', this.on_change);
      eyenovate.comments.update();

      eyenovate.comments.title_field.disabled = true;
      eyenovate.comments.body_field.disabled = true;
	  },

	  fetch: function(type, id) {
	    eyenovate.comments.comment_type = type;
	    eyenovate.comments.comment_id   = id;

	    new Ajax.Request('/ajax/comments/fetch', {
	      method: 'post',
	      parameters: {commentable_type: type, commentable_id: id},
	      onSuccess: function(transport) {
	        eyenovate.comments.comments = transport.responseText.evalJSON(true);

	        // load up the comment list
	        eyenovate.comments.comments.each(function(comment) {
	          var opt = new Element('option', {value: comment.id});
	          var formatted_date = comment.created_at.substr(0, 10);

	          opt.innerHTML = formatted_date + " - " + comment.title;
	          eyenovate.comments.list_field.options.add(opt);
	        })
	      }
	    });

	    return null;
	  },

	  on_change: function(e) {
	    var idx = e.currentTarget.selectedIndex;
	    eyenovate.comments.selected_idx = idx;
	    eyenovate.comments.selected_item = eyenovate.comments.list_field.options[idx];
	    eyenovate.comments.selected_comment = eyenovate.comments.comments[idx];
      eyenovate.comments.update();
	  },

	  create: function() {
	    var d = new Date();
	    var formatted_date = d.getFullYear() + "-" + (Number(d.getMonth())+1) + "-" + d.getDate();
	    var new_list_item = new Element('option', {value: formatted_date, selected: 'selected'});
	    var new_comment = {
	      id: '',
	      commentable_type: eyenovate.comments.comment_type,
	      commentable_id: eyenovate.comments.comment_id,
	      created_at: formatted_date,
	      title: '',
	      body: ''
	    };

	    eyenovate.comments.comments.push(new_comment);
	    eyenovate.comments.list_field.options.add(new_list_item);
	    eyenovate.comments.selected_idx = eyenovate.comments.list_field.selectedIndex;

	    eyenovate.comments.selected_comment = new_comment;
	    eyenovate.comments.selected_item    = new_list_item;

	    eyenovate.comments.update();
	    eyenovate.comments.title_field.focus();
	  },

	  save: function() {
	    if (!eyenovate.comments.comment_type || !eyenovate.comments.comment_id) {
	      alert("Comments never Fetched. No type or ID set");
	      return;
	    }
	    if (!eyenovate.comments.selected_comment) {
	      alert("No comment selected or created to be saved");
	      return;
	    }

	    eyenovate.comments.list_field.disabled = true;
	    eyenovate.comments.title_field.disabled = true;
      eyenovate.comments.body_field.disabled = true;

	    new Ajax.Request('/ajax/comments/save', {
	      method: 'post',
	      parameters: {
	        id: eyenovate.comments.list_field.options[eyenovate.comments.list_field.selectedIndex].value,
  	      commentable_type: eyenovate.comments.comment_type,
  	      commentable_id:   eyenovate.comments.comment_id,
  	      title:            eyenovate.comments.title_field.value,
  	      body:             eyenovate.comments.body_field.value,
  	      author_type:      "admin"
	      },
	      onSuccess: function(transport) {
	        var json = transport.responseText.evalJSON(true);
          if (!json.id) {
            alert("Failed to save comment");
          }
          else {
            eyenovate.comments.comments[eyenovate.comments.selected_idx] = json;
            eyenovate.comments.selected_comment = eyenovate.comments.comments[eyenovate.comments.selected_idx];
            eyenovate.comments.selected_item.value = json.id;
          }

          eyenovate.comments.update();
	      }
	    });
	  },

	  update: function() {
	    var comment = eyenovate.comments.selected_comment;
	    var list_item = eyenovate.comments.selected_item;

      if (!comment) {
        eyenovate.comments.title_field.disabled = true;
        eyenovate.comments.body_field.disabled = true;
        return;
      }

      var formatted_date = comment.created_at.substr(0, 10);

      eyenovate.comments.list_field.disabled = false;
      eyenovate.comments.title_field.disabled = false;
      eyenovate.comments.body_field.disabled = false;

      list_item.value = comment.id;
      list_item.innerHTML = formatted_date + " - " + comment.title;
      eyenovate.comments.date_element.innerHTML = formatted_date;
      eyenovate.comments.title_field.value = comment.title;
      eyenovate.comments.body_field.value = comment.body;
	  }
	},

	/*** Backorder Items ***/
	backorder_items: {
	  select_field: null,
	  contact_id: null,
	  callback: null,
	  items: null,

	  init: function(contact_field, callback) {
      if (isNaN(contact_field * 1)) {
  	    this.select_field = contact_field;
  	    YAHOO.util.Event.addListener(contact_field, 'change', eyenovate.backorder_items.contact_changed);
      }
      else {
        eyenovate.backorder_items.contact_id = contact_field;
      }

	    this.callback = callback;
	    this.contact_changed(null);
	  },

	  contact_changed: function(ev) {
	    if (eyenovate.backorder_items.select_field) {
        var list = eyenovate.backorder_items.select_field;
        var idx  = eyenovate.backorder_items.select_field.selectedIndex;
        var cid = list[idx].value;
        eyenovate.backorder_items.contact_id = cid;
      }


      if (!eyenovate.backorder_items.contact_id) return;

	    new Ajax.Request('/ajax/backorder_items/fetch', {
        method: 'post',
        parameters: {
	        contact_id: eyenovate.backorder_items.contact_id
	      },
	      onSuccess: function(transport) {
	        var json = transport.responseText.evalJSON(true);
	        eyenovate.backorder_items.items = json;
	      }
	    });
	  },

	  display_dialog: function(ifYes, ifNo) {
	    var item_count = eyenovate.backorder_items.items.length;

	    if (item_count == 0) {
	      ifYes();
	      return;
      }

	    var message = "You have the following items on backorder that are now available:<br/><br/>";
	    eyenovate.backorder_items.items.each(function(it) {
	      message += "    " + it.product_name + " : " + it.quantity + "<br/>";
	    });
	    message += "<br/>Would you like to add them to your order now?";

	    var dialog = new YAHOO.widget.SimpleDialog("delDialog",
				{ width: "400px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: message,
					constraintoviewport: true,
					buttons: [ {
					  text:"Yes",
					  handler: function() {
					    eyenovate.backorder_items.callback(eyenovate.backorder_items.items);
					    eyenovate.backorder_items.delete_items();
					    this.hide();
					    ifYes();
				    }}, {
				      text:"No",
				      handler: function() { ifNo(); this.hide(); }
				    }]
				});
			dialog.setHeader("Add Backordered Items to Order");
			dialog.render("container");
			dialog.show();
	  },

	  delete_items: function() {
	    new Ajax.Request('/ajax/backorder_items/remove', {
	      method: 'post',
	      parameters: { contact_id: eyenovate.backorder_items.contact_id }
	    });
	  }
	},

	/*************************************
	User Action Dialogs
	*************************************/
	dialog: {
		delDialog: null,
		delYes: null,
		delNo: null,
		del: function ( ifYes ){
			eyenovate.dialog.delYes = ifYes;

			eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog("delDialog",
				{ width: "300px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: "Are you sure you want to delete this?",
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [ { text:"Yes", handler: function(){ if(eyenovate.dialog.delYes.submit){eyenovate.dialog.delYes.submit();}else{eyenovate.dialog.delYes();}; this.hide(); }, isDefault:true },
								{ text:"No",  handler: function(){ this.hide(); } } ]
				} );
			eyenovate.dialog.delDialog.setHeader("Are you sure?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		back_order: function(ifYes, ifNo) {
		  eyenovate.dialog.delYes = ifYes;
		  eyenovate.dialog.delNo = ifNo;

		  eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog('delDialog', {
		    width: "400px",
		    fixedCenter: true,
		    visible: false,
		    draggable: false,
		    close: true,
		    modal: true,
		    text: "Some Items on your order need to be Backordered.<br /><br />If this is OK press YES.<br />" +
		          "If you would like to remove these items, press NO.",
		    icon: YAHOO.widget.SimpleDialog.ICON_WARNING,
		    constraintoviewport: true,
		    buttons: [
		      {text:'Yes', handler: function(){if (eyenovate.dialog.delYes) eyenovate.dialog.delYes(1); this.hide(); }},
		      {text:'No', handler: function(){if (eyenovate.dialog.delNo) eyenovate.dialog.delNo(); this.hide(); }}
		    ]
		  });
		  eyenovate.dialog.delDialog.setHeader("Allow Backorder Items?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		backorder: function( ifYes, ifNo ) {
		  eyenovate.dialog.delYes = ifYes;
      eyenovate.dialog.delNo = ifNo;

		  eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog('delDialog', {
		    width: "400px",
		    fixedCenter: true,
		    visible: false,
		    draggable: false,
		    close: true,
		    modal: true,
		    text: "Are you sure you want to backorder ALL items in this order?",
		    icon: YAHOO.widget.SimpleDialog.ICON_WARNING,
		    constraintoviewport: true,
		    buttons: [
		      {text:'Yes', handler: function(){if (eyenovate.dialog.delYes) eyenovate.dialog.delYes(); this.hide(); }},
		      {text:'No', handler: function(){ if (eyenovate.dialog.delNo) eyenovate.dialog.delNo(); this.hide(); }}
		    ]
		  });
		  eyenovate.dialog.delDialog.setHeader("Backorder ALL Items?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		save_order: function ( ifYes ){
			eyenovate.dialog.delYes = ifYes;

			eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog("delDialog",
				{ width: "350px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: "Are you sure this order is complete and correct?",
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [ { text:"Yes", handler: function(){ if(eyenovate.dialog.delYes.submit){eyenovate.dialog.delYes.submit();}else{eyenovate.dialog.delYes();}; this.hide(); }, isDefault:true },
								{ text:"No",  handler: function(){ this.hide(); } } ]
				} );
			eyenovate.dialog.delDialog.setHeader("Are you sure?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		verify_extended_date: function ( ifYes ){
			eyenovate.dialog.delYes = ifYes;

			eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog("delDialog",
				{ width: "350px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: "Is the following expected delivery date still correct?<br/><br/>" + $('expected_date').value,
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [ { text:"Yes", handler: function(){ if(eyenovate.dialog.delYes.submit){eyenovate.dialog.delYes.submit();}else{eyenovate.dialog.delYes();}; this.hide(); }, isDefault:true },
								{ text:"No",  handler: function(){ this.hide(); } } ]
				} );
			eyenovate.dialog.delDialog.setHeader("Are you sure?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		backdate: function ( ifYes, ifNo ){
			eyenovate.dialog.delYes = ifYes;
			eyenovate.dialog.delNo  = ifNo;

			eyenovate.dialog.delDialog = new YAHOO.widget.SimpleDialog("delDialog",
				{ width: "300px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: "Are you sure you want to backdate this order to the ordered date?",
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [
					  { text:"Yes",
					    handler: function() {
					      if (eyenovate.dialog.delYes.submit) {
					        if (eyenovate.dialog.delYes.back_dated)
					          eyenovate.dialog.delYes.back_dated.value = 1;

					        eyenovate.dialog.delYes.submit();
					      }
					      else {
					        eyenovate.dialog.delYes(1);
					      };
					      this.hide();
					    },
					    isDefault: true
					  },
						{ text:"No",  handler: function() {
						  if (eyenovate.dialog.delNo)
						    eyenovate.dialog.delNo();
						  this.hide();
						} }
					]
				}
			);
			eyenovate.dialog.delDialog.setHeader("Are you sure?");
			eyenovate.dialog.delDialog.render("container");
			eyenovate.dialog.delDialog.show();
		},

		restoreDialog: null,
		restore: function ( ifYes ){
			eyenovate.dialog.restoreDialog = new YAHOO.widget.SimpleDialog("restoreDialog",
				{ width: "300px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: "Are you sure you want to restore this record?",
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [ { text:"Yes", handler: function(){ ifYes(); this.hide(); }, isDefault:true },
								{ text:"No",  handler: function(){ this.hide(); } } ]
				} );
			eyenovate.dialog.restoreDialog.setHeader("Are you sure?");
			eyenovate.dialog.restoreDialog.render("container");
			eyenovate.dialog.restoreDialog.show();
		},


		alertDialog: null,
		alert: function(text, header){
			eyenovate.dialog.alertDialog = new YAHOO.widget.SimpleDialog("alertDialog",
				{ width: "300px",
					fixedcenter: true,
					visible: false,
					draggable: false,
					close: true,
					modal: true,
					text: text,
					icon: YAHOO.widget.SimpleDialog.ICON_HELP,
					constraintoviewport: true,
					buttons: [ { text:"OK", handler: function(){ this.hide(); }, isDefault:true }]
				} );
			eyenovate.dialog.alertDialog.setHeader(header);
			eyenovate.dialog.alertDialog.render("container");
			eyenovate.dialog.alertDialog.show();
		}
	},

	/*************************************
	Datatable
	*************************************/

	datatable: {

		DataSource: null,
		DataTable: null,
		Paginator: null,
		OrigArgs: null,

		myURL: null,
		myFilter: null,
		myFieldlist: null,
		myColumns: null,

		myContainer: null,
		myPageCont: null,
		myPageCont2: null,
		myTableCont: null,

		init: function(oTarget, oURL, oColumns, oClick, oArgs){
			// setup the base data

			eyenovate.datatable.myFieldlist = new Array();
			oColumns.each(function(item, index) {
				if (item.key)
					eyenovate.datatable.myFieldlist[eyenovate.datatable.myFieldlist.length] = item.key;
			});

			eyenovate.datatable.myColumns = oColumns;
			eyenovate.datatable.myContainer = oTarget;
			eyenovate.datatable.myURL = oURL;

			if (oArgs)
				eyenovate.datatable.OrigArgs = oArgs;

			if (oClick)
				eyenovate.datatable.rowClick = oClick;

			if (oArgs && oArgs.filter)
				eyenovate.datatable.myFilter = oArgs.filter;

			// create the html for the things
			eyenovate.datatable.myPageCont = new Element('div', {className: 'tc'});
			eyenovate.datatable.myContainer.insert(eyenovate.datatable.myPageCont);
			eyenovate.datatable.myTableCont = new Element('div', {className: 'yui-selectable'});
			eyenovate.datatable.myContainer.insert(eyenovate.datatable.myTableCont);
			eyenovate.datatable.myPageCont2 = new Element('div', {className: 'tc'});
			eyenovate.datatable.myContainer.insert(eyenovate.datatable.myPageCont2);

			// create the datasource / paginator
			eyenovate.datatable._init_datasource();
			eyenovate.datatable._init_paginator();
			eyenovate.datatable._init_table();
		},

		_init_paginator: function(){
			eyenovate.datatable.Paginator = new YAHOO.widget.Paginator({
		        containers         : [eyenovate.datatable.myPageCont, eyenovate.datatable.myPageCont2],
		        pageLinks          : 10,
		        rowsPerPage        : 30,
		        rowsPerPageOptions : [30,60,90,500,1000],
		        template           : "<div style=\"float: right;\">{CurrentPageReport} {RowsPerPageDropdown}</div><div style=\"margin-left: 20%; margin-right: 20%;\">{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}</div>",
				pageReportTemplate : 'Rows: {startIndex} - {endIndex} of {totalRecords}' ,
				firstPageLinkLabel : "<img src=\"" + eyenovate.siteroot + "/img/2leftarrow.png\" />",
				lastPageLinkLabel : "<img src=\"" + eyenovate.siteroot + "/img/2rightarrow.png\" />",
				previousPageLinkLabel : "<img src=\"" + eyenovate.siteroot + "/img/1leftarrow.png\" />",
				nextPageLinkLabel : "<img src=\"" + eyenovate.siteroot + "/img/1rightarrow.png\" />"
		    });
		},

		_init_datasource: function(){
			eyenovate.datatable.DataSource = new YAHOO.util.DataSource(eyenovate.datatable.myURL + "?");
		    eyenovate.datatable.DataSource.responseType   = YAHOO.util.DataSource.TYPE_JSON;
		    eyenovate.datatable.DataSource.responseSchema = {
		        resultsList : 'rows' ,
		        fields      : eyenovate.datatable.myFieldlist ,
		        metaFields : { totalRecords: 'totalRecords' }
		    };
		},

		_init_table: function(){
			var myTableConfig = {
		        initialRequest         	: eyenovate.datatable.queryString(),
		        generateRequest        	: eyenovate.datatable.queryString,
		        paginationEventHandler 	: YAHOO.widget.DataTable.handleDataSourcePagination,
		        paginator              	: eyenovate.datatable.Paginator,
				sortedBy				: {key: eyenovate.datatable.OrigArgs.orderBy ? eyenovate.datatable.OrigArgs.orderBy : eyenovate.datatable.myFieldlist[0] ,
											dir: eyenovate.datatable.OrigArgs.orderDir ? eyenovate.datatable.OrigArgs.orderDir : YAHOO.widget.DataTable.CLASS_ASC},
				selectionMode			: "single"
		    };

			eyenovate.datatable.DataTable = new YAHOO.widget.DataTable(
									eyenovate.datatable.myTableCont,
									eyenovate.datatable.myColumns,
									eyenovate.datatable.DataSource,
									myTableConfig);


			eyenovate.datatable.DataTable.subscribe("rowMouseoverEvent", eyenovate.datatable.DataTable.onEventHighlightRow);
			eyenovate.datatable.DataTable.subscribe("rowMouseoutEvent", eyenovate.datatable.DataTable.onEventUnhighlightRow);
			eyenovate.datatable.DataTable.subscribe("rowClickEvent", eyenovate.datatable.rowClick);

			eyenovate.datatable.DataTable.sortColumn = function(oColumn){
				// Default ascending
				var sDir = "asc"

				// If already sorted, sort in opposite direction
				if(oColumn.key === this.get("sortedBy").key) {
				    sDir = (this.get("sortedBy").dir === YAHOO.widget.DataTable.CLASS_ASC) ?
				            "desc" : "asc";
				}

				// Pass in sort values to server request
				//var newRequest = "col=" + oColumn.key + "&desc=" + sDir + "&count="+ myPaginator.getRowsPerPage() +"&start="+ myPaginator.getPageRecords()[0] + "&filter=" + $F('filter');
				var newRequest = eyenovate.datatable.queryString(false, false, { col: oColumn.key, dir: sDir, start: eyenovate.datatable.Paginator.getPageRecords()[0], count: eyenovate.datatable.Paginator.getRowsPerPage() } );

				// Create callback for data request
				var oCallback = {
				    success: this.onDataReturnInitializeTable,
				    failure: this.onDataReturnInitializeTable,
				    scope: this,
				    argument: {
				        // Pass in sort values so UI can be updated in callback function
				        sorting: {
				            key: oColumn.key,
				            dir: (sDir === "asc") ? YAHOO.widget.DataTable.CLASS_ASC : YAHOO.widget.DataTable.CLASS_DESC
				        },
						startIndex: eyenovate.datatable.Paginator.getPageRecords()[0]
				    }
				}

				// Send the request
				this.getDataSource().sendRequest(newRequest, oCallback, this);
			};

			eyenovate.datatable.DataTable.refresh = function() {
				this.getDataSource().sendRequest(eyenovate.datatable.queryString(), {
					success: this.onDataReturnInitializeTable,
					failure: this.onDataReturnInitializeTable,
					scope: this,
					argument: {
						sorting: {
							key: this.get("sortedBy").key,
							dir: this.get("sortedBy").dir
						},
						startIndex: eyenovate.datatable.Paginator.getPageRecords() ? eyenovate.datatable.Paginator.getPageRecords()[0] : 0
					}
				}, this);

				if(eyenovate.datatable.Paginator.getTotalPages() < eyenovate.datatable.Paginator.getCurrentPage())
					eyenovate.datatable.Paginator.setPage(eyenovate.datatable.Paginator.getTotalPages());
			};
		},

		refresh: function() {
		  eyenovate.datatable.DataTable.refresh();
		},

		rowClick: function( oArgs ){},

		queryString: function(state, dt, more){
			if(dt){
				var col = dt.get("sortedBy").key;
				var dir = (dt.get("sortedBy").dir === YAHOO.widget.DataTable.CLASS_ASC) ? "asc" : "desc";
			}else if(more){
				var col = more.col;
				var dir = more.dir;
			}else{
				var col = eyenovate.datatable.OrigArgs.orderBy ? eyenovate.datatable.OrigArgs.orderBy : eyenovate.datatable.myFieldlist[0];
				var dir = eyenovate.datatable.OrigArgs.orderDir ? eyenovate.datatable.OrigArgs.orderDir : "asc";
			}

			if(state){
				var start = state.pagination.recordOffset;
				var count = state.pagination.rowsPerPage;
			}else if(more){
				var start = more.start;
				var count = more.count;
			}else{
				var start = 0;
				var count = 30;
			}

			var query = "col=" + col +
						"&desc=" + dir +
						"&start=" + start +
						"&count=" + count + "&";

			if(eyenovate.datatable.myFilter)
				query += eyenovate.datatable.myFilter();

			return query;
		}
	},

	/*************************************
	Utility Functions
	*************************************/
	getFormIndex: function (input) {
	    var index = -1, i = 0, found = false;
	    while (i < input.form.length && index == -1)
	    if (input.form[i] == input)index = i;
	    else i++;
	    return index;
	}
};


/*************************************
init()
*************************************/
function init(){
    // product image tooltip
    eyenovate.product_tooltip.init();

	// calendar
	eyenovate.calendar.init();
}

YAHOO.util.Event.addListener(window, "load", init);


var Dom = YAHOO.util.Dom;
var YEvent = YAHOO.util.Event;
var DDM = YAHOO.util.DragDropMgr;
YAHOO.example.DDList = function(id, sGroup, config) {

    YAHOO.example.DDList.superclass.constructor.call(this, id, sGroup, config);

    this.logger = this.logger || YAHOO;
    var el = this.getDragEl();
    Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent

    this.goingUp = false;
    this.lastY = 0;
};

YAHOO.extend(YAHOO.example.DDList, YAHOO.util.DDProxy, {
    startDrag: function(x, y) {
        this.logger.log(this.id + " startDrag");

        // make the proxy look like the source element
        var dragEl = this.getDragEl();
        var clickEl = this.getEl();
        Dom.setStyle(clickEl, "visibility", "hidden");

        dragEl.innerHTML = clickEl.innerHTML;

        Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color"));
        Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor"));
        Dom.setStyle(dragEl, "border", "2px solid gray");
    },

    endDrag: function(e) {
		  this.logger.log(this.id + " endDrag");
        var srcEl = this.getEl();
        var proxy = this.getDragEl();

        // Show the proxy element and animate it to the src element's location
        Dom.setStyle(proxy, "visibility", "");
        var a = new YAHOO.util.Motion(
            proxy, {
                points: {
                    to: Dom.getXY(srcEl)
                }
            },
            0.2,
            YAHOO.util.Easing.easeOut
        )
        var proxyid = proxy.id;
        var thisid = this.id;

        // Hide the proxy and show the source element when finished with the animation
        a.onComplete.subscribe(function() {
                Dom.setStyle(proxyid, "visibility", "hidden");
                Dom.setStyle(thisid, "visibility", "");
            });
        a.animate();
    },

    onDragDrop: function(e, id) {
		this.logger.log(this.id + " dragDrop");
        // If there is one drop interaction, the tr was dropped either on the table,
        // or it was dropped on the current location of the source element.
        if (DDM.interactionInfo.drop.length === 1) {

            // The position of the cursor at the time of the drop (YAHOO.util.Point)
            var pt = DDM.interactionInfo.point;

            // The region occupied by the source element at the time of the drop
            var region = DDM.interactionInfo.sourceRegion;

            // Check to see if we are over the source element's location.  We will
            // append to the bottom of the list once we are sure it was a drop in
            // the negative space (the area of the table without any items)
            if (!region.intersect(pt)) {
                var destEl = Dom.get(id);
                var destDD = DDM.getDDById(id);
                destEl.appendChild(this.getEl());
                destDD.isEmpty = false;
                DDM.refreshCache();
            }

        }
    },

    onDrag: function(e) {

        // Keep track of the direction of the drag for use during onDragOver
        var y = YEvent.getPageY(e);

        if (y < this.lastY) {
            this.goingUp = true;
        } else if (y > this.lastY) {
            this.goingUp = false;
        }

        this.lastY = y;
    },

    onDragOver: function(e, id) {

        var srcEl = this.getEl();
        var destEl = Dom.get(id);

        // We are only concerned with tr items, we ignore the dragover
        // notifications for the table.
        if (destEl.nodeName.toLowerCase() == "tr") {
            var orig_p = srcEl.parentNode;
            var p = destEl.parentNode;

            if (this.goingUp) {
                p.insertBefore(srcEl, destEl); // insert above
            } else {
                p.insertBefore(srcEl, destEl.nextSibling); // insert below
            }

            DDM.refreshCache();
        }
    }
});


/*************************************
Misc Functions
*************************************/
function LZ(x) {return(x<0||x>9?"":"0")+x}

Number.prototype.formatMoney = function(c, d, t) {
  var n = this,
    c = isNaN(c = Math.abs(c)) ? 2 : c,
    d = d == undefined ? "," : d,
    t = t == undefined ? "." : t,
    s = n < 0 ? "-" : "",
    i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "",
    j = (j = i.length) > 3 ? j % 3 : 0;

  return s + (j ? i.substr(0, j) + t : "") +
    i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
    (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
 };
