
/* *
 * Nozbe - site javascript - depending on prototype!
 * (c) 2006+ by Michael Sliwinski
 */

/* *
 * Nozbe forms
 */

function login(myform) {
	var form_items = $(myform).getElementsByTagName('input');
	var result = '';
	for (var i = 0; i < form_items.length; i++) {
		if (!form_items[i].value) {
			result = 'fillout';
		}
		if (form_items[i].id=='email') {
			if (!emailcheck(form_items[i].value)) {
				result = 'email_valid';
			}
		}
	}
	if (result) {
		alert(signuperror[result]);
		$('email').focus();
		return false;
	} else {
		return true;
	}
}

function signup(request) {
	var error = request.getResponseHeader("Error");
	var result = '';
	if (error=='1') {
		result = 'email_exists';
	}
	if (error=='2') {
		result = 'error';
	}
	if (result) {
		alert(signuperror[result]);
		Element.hide('progress');
		$('submit').disabled='';
	} else {
		$('signup_steps').innerHTML = request.responseText;
		new Effect.Highlight('signup_steps', { delay: 0.2 });
	}
}

function formconfirm(myform,passvar) {
	if (!passvar) passvar='';
	var result = '';
	var noalpha = /^[a-zA-Z0-9]*$/;
	if ($(passvar+'password').value!='') {
		if (!noalpha.test($(passvar+'password').value)) {
			result = 'pass1';
		}
		if ($(passvar+'password').value.length<4) {
			result = 'pass1';
		}
		if (!result) {
			if ($(passvar+'password').value!=$('2password').value) {
				result = 'pass2';
			}
		}
	} else {
		if (passvar) {
			result = 'pass1';
		}
	}
	if (result) {
		alert(signuperror[result]);
		$(passvar+'password').focus();
		return false;
	} else {
		return true;
	}
}

function formcheck(myform) {
	var form_items = $(myform).getElementsByTagName('input');
	var result = '';
	if ((myform=='signup') || (myform=='order')) {
		if (!$('terms').checked) {
			result = 'terms';
		}
	}
	for (var i = 0; i < form_items.length; i++) {
		if (!$(form_items[i].id).value) {
			result = 'fillout';
		}
		if ((myform=='signup') || (myform=='order')) {
			if (form_items[i].id=='email') {
				if (!emailcheck(form_items[i].value)) {
					result = 'email';
				}
			}
		}
	}
	if (result) {
		alert(signuperror[result]);
		$('name').focus();
		return false;
	} else {
		if (myform=='order') {
			return formconfirm('order');
		}
		return true;
	}
}

function timezone() {
	var curDateTime = new Date();
	$('time_zone').value = (-(curDateTime.getTimezoneOffset()/60));
}


/* *
 * Email checking funcitons
 */


function emailcheck (emailStr) {
	// V1.1.3: Sandeep V. Tamhankar (stamhankar@hotmail.com)
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	if (matchArray==null) {
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return false;
		}
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
		}
	}
	if (user.match(userPat)==null) {
		return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false;
			}
		}
		return true;
	}
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
		}
	}
	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
	}
	if (len<2) {
		return false;
	}
	return true;
}

/* *
 * Email encrypting funcitons
 */

// This script is (C) Copyright 2002 Jim Tucek
// Leave these comments alone!  For more info, visit
// www.jracademy.com/~jtucek/ 

function eat(level,machine,method) {
	level += ' ';
	var culture = level.length;
	var oxygen = 0;
	var crust = '';
	for(var song = 0; song < culture; song++) {
		oxygen = 0;
		while(level.charCodeAt(song) != 32) {
			oxygen = oxygen * 10;
			oxygen = oxygen + level.charCodeAt(song)-48;
			song++;
		}
		crust += String.fromCharCode(let(oxygen,machine,method));
	}
	parent.location = 'm'+'a'+'i'+'l'+'t'+'o'+':'+crust;
}

function hurt(tail,stipulation,fuel) {
	tail += ' ';
	var singer = tail.length;
	var field = 0;
	for(var debate = 0; debate < singer; debate++) {
		field = 0;
		while(tail.charCodeAt(debate) != 32) {
			field = field * 10;
			field = field + tail.charCodeAt(debate)-48;
			debate++;
		}
		document.write('&');
		document.write('#');
		document.write(let(field,stipulation,fuel));
	}
}

function let(composer,male,hieroglyphic) {
	if (hieroglyphic % 2 == 0) {
		head = 1;
		for(var soul = 1; soul <= hieroglyphic/2; soul++) {
			privacy = (composer*composer) % male;
			head = (privacy*head) % male;
		}
	} else {
		head = composer;
		for(var algebra = 1; algebra <= hieroglyphic/2; algebra++) {
			privacy = (composer*composer) % male;
			head = (privacy*head) % male;
		}
	}
	return head;
}

/*
 * Copyright (c) 2006 Jonathan Weiss <jw@innerewut.de>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/* tooltip-0.2.js - Small tooltip library on top of Prototype 
 * by Jonathan Weiss <jw@innerewut.de> distributed under the BSD license. 
 *
 * This tooltip library works in two modes. If it gets a valid DOM element 
 * or DOM id as an argument it uses this element as the tooltip. This 
 * element will be placed (and shown) near the mouse pointer when a trigger-
 * element is moused-over.
 * If it gets only a text as an argument instead of a DOM id or DOM element
 * it will create a div with the classname 'tooltip' that holds the given text.
 * This newly created div will be used as the tooltip. This is usefull if you 
 * want to use tooltip.js to create popups out of title attributes.
 * 
 *
 * Usage: 
 *   <script src="/javascripts/prototype.js" type="text/javascript"></script>
 *   <script src="/javascripts/tooltip.js" type="text/javascript"></script>
 *   <script type="text/javascript">
 *     // with valid DOM id
 *     var my_tooltip = new Tooltip('id_of_trigger_element', 'id_of_tooltip_to_show_element')
 *
 *     // with text
 *     var my_other_tooltip = new Tooltip('id_of_trigger_element', 'a nice description')
 *
 *     // create popups for each element with a title attribute
 *    Event.observe(window,"load",function() {
 *      $$("*").findAll(function(node){
 *        return node.getAttribute('title');
 *      }).each(function(node){
 *        new Tooltip(node,node.title);
 *        node.removeAttribute("title");
 *      });
 *    });
 *    
 *   </script>
 * 
 * Now whenever you trigger a mouseOver on the `trigger` element, the tooltip element will
 * be shown. On o mouseOut the tooltip disappears. 
 * 
 * Example:
 * 
 *   <script src="/javascripts/prototype.js" type="text/javascript"></script>
 *   <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
 *   <script src="/javascripts/tooltip.js" type="text/javascript"></script>
 *
 *   <div id='tooltip' style="display:none; margin: 5px; background-color: red;">
 *     Detail infos on product 1....<br />
 *   </div>
 *
 *   <div id='product_1'>
 *     This is product 1
 *   </div>
 *
 *   <script type="text/javascript">
 *     var my_tooltip = new Tooltip('product_1', 'tooltip')
 *   </script>
 *
 * You can use my_tooltip.destroy() to remove the event observers and thereby the tooltip.
 */

var Tooltip = Class.create();
Tooltip.prototype = {
  initialize: function(element, tool_tip) {
    var options = Object.extend({
      default_css: false,
      margin: "0px",
	    padding: "5px",
	    backgroundColor: "#d6d6fc",
	    min_distance_x: 5,
      min_distance_y: 5,
      delta_x: 0,
      delta_y: 0,
      zindex: 1000
    }, arguments[2] || {});

    this.element      = $(element);

    this.options      = options;
    
    // use the supplied tooltip element or create our own div
    if($(tool_tip)) {
      this.tool_tip = $(tool_tip);
    } else {
      this.tool_tip = $(document.createElement("div")); 
      document.body.appendChild(this.tool_tip);
      this.tool_tip.addClassName("tooltip");
      this.tool_tip.appendChild(document.createTextNode(tool_tip));
    }

    // hide the tool-tip by default
    this.tool_tip.hide();

    this.eventMouseOver = this.showTooltip.bindAsEventListener(this);
    this.eventMouseOut   = this.hideTooltip.bindAsEventListener(this);
    this.eventMouseMove  = this.moveTooltip.bindAsEventListener(this);

    this.registerEvents();
  },

  destroy: function() {
    Event.stopObserving(this.element, "mouseover", this.eventMouseOver);
    Event.stopObserving(this.element, "mouseout", this.eventMouseOut);
    Event.stopObserving(this.element, "mousemove", this.eventMouseMove);
  },

  registerEvents: function() {
    Event.observe(this.element, "mouseover", this.eventMouseOver);
    Event.observe(this.element, "mouseout", this.eventMouseOut);
    Event.observe(this.element, "mousemove", this.eventMouseMove);
  },

  moveTooltip: function(event){
	  Event.stop(event);
	  // get Mouse position
    var mouse_x = Event.pointerX(event);
	  var mouse_y = Event.pointerY(event);
	
	  // decide if wee need to switch sides for the tooltip
	  var dimensions = Element.getDimensions( this.tool_tip );
	  var element_width = dimensions.width;
	  var element_height = dimensions.height;
	
	  if ( (element_width + mouse_x) >= ( this.getWindowWidth() - this.options.min_distance_x) ){ // too big for X
		  mouse_x = mouse_x - element_width;
		  // apply min_distance to make sure that the mouse is not on the tool-tip
		  mouse_x = mouse_x - this.options.min_distance_x;
	  } else {
		  mouse_x = mouse_x + this.options.min_distance_x;
	  }
	
	  if ( (element_height + mouse_y) >= ( this.getWindowHeight() - this.options.min_distance_y) ){ // too big for Y
		  mouse_y = mouse_y - element_height;
	    // apply min_distance to make sure that the mouse is not on the tool-tip
		  mouse_y = mouse_y - this.options.min_distance_y;
	  } else {
		  mouse_y = mouse_y + this.options.min_distance_y;
	  } 
	
	  // now set the right styles
	  this.setStyles(mouse_x, mouse_y);
  },
	
		
  showTooltip: function(event) {
    Event.stop(event);
    this.moveTooltip(event);
	  new Element.show(this.tool_tip);
  },
  
  setStyles: function(x, y){
    // set the right styles to position the tool tip
	  Element.setStyle(this.tool_tip, { position:'absolute',
	 								    top:y + this.options.delta_y + "px",
	 								    left:x + this.options.delta_x + "px",
									    zindex:this.options.zindex
	 								  });
	
	  // apply default theme if wanted
	  if (this.options.default_css){
	  	  Element.setStyle(this.tool_tip, { margin:this.options.margin,
		 		  						                    padding:this.options.padding,
		                                      backgroundColor:this.options.backgroundColor,
										                      zindex:this.options.zindex
		 								    });	
	  }	
  },

  hideTooltip: function(event){
	  new Element.hide(this.tool_tip);
  },

  getWindowHeight: function(){
    var innerHeight;
	  if (navigator.appVersion.indexOf('MSIE')>0) {
		  innerHeight = document.body.clientHeight;
    } else {
		  innerHeight = window.innerHeight;
    }
    return innerHeight;	
  },
 
  getWindowWidth: function(){
    var innerWidth;
	  if (navigator.appVersion.indexOf('MSIE')>0) {
		  innerWidth = document.body.clientWidth;
    } else {
		  innerWidth = window.innerWidth;
    }
    return innerWidth;	
  }

}
