// Browser Detect  v2.1.6
// documentation: http://www.dithered.com/javascript/browser_detect/index.html
// license: http://creativecommons.org/licenses/by/1.0/
// code by Chris Nott (chris[at]dithered[dot]com)

function BrowserDetect() {
   var ua = navigator.userAgent.toLowerCase(); 

   // browser engine name
   this.isGecko       = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
   this.isAppleWebKit = (ua.indexOf('applewebkit') != -1);

   // browser name
   this.isKonqueror   = (ua.indexOf('konqueror') != -1); 
   this.isSafari      = (ua.indexOf('safari') != - 1);
   this.isOmniweb     = (ua.indexOf('omniweb') != - 1);
   this.isOpera       = (ua.indexOf('opera') != -1); 
   this.isIcab        = (ua.indexOf('icab') != -1); 
   this.isAol         = (ua.indexOf('aol') != -1); 
   this.isIE          = (ua.indexOf('msie') != -1 && !this.isOpera && (ua.indexOf('webtv') == -1) ); 
   this.isMozilla     = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
   this.isFirefox	    = (ua.indexOf('firefox/') != -1);
   this.isFlock	    	= (ua.indexOf('flock/') != -1);
   this.isCamino	    = (ua.indexOf('camino/') != -1);
   this.isNS          = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && !this.isOpera && !this.isSafari && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
   
   // spoofing and compatible browsers
   this.isIECompatible = ( (ua.indexOf('msie') != -1) && !this.isIE);
   this.isNSCompatible = ( (ua.indexOf('mozilla') != -1) && !this.isNS && !this.isMozilla);
   
   // rendering engine versions
   this.geckoVersion = ( (this.isGecko) ? ua.substring( (ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14) ) : -1 );
   this.equivalentMozilla = ( (this.isGecko) ? parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) ) : -1 );
   this.appleWebKitVersion = ( (this.isAppleWebKit) ? parseFloat( ua.substring( ua.indexOf('applewebkit/') + 12) ) : -1 );
   
   // browser version
   this.versionMinor = parseFloat(navigator.appVersion); 
   
   // correct version number
   if (this.isGecko && !this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('/', ua.indexOf('gecko/') + 6) + 1 ) );
   }
   else if (this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) );
   }
   else if (this.isIE && this.versionMinor >= 4) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('msie ') + 5 ) );
   }
   else if (this.isKonqueror) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('konqueror/') + 10 ) );
   }
   else if (this.isSafari) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('safari/') + 7 ) );
   }
   else if (this.isOmniweb) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('omniweb/') + 8 ) );
   }
   else if (this.isOpera) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('opera') + 6 ) );
   }
   else if (this.isIcab) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('icab') + 5 ) );
   }
   
   this.versionMajor = parseInt(this.versionMinor); 
   
   // dom support
   this.isDOM1 = (document.getElementById);
   this.isDOM2Event = (document.addEventListener && document.removeEventListener);
   
   // css compatibility mode
   this.mode = document.compatMode ? document.compatMode : 'BackCompat';

   // platform
   this.isWin    = (ua.indexOf('win') != -1);
   this.isWin32  = (this.isWin && ( ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1) );
   this.isMac    = (ua.indexOf('mac') != -1);
   this.isUnix   = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1)
   this.isLinux  = (ua.indexOf('linux') != -1);

   //ie7
   ie7=(navigator.appVersion.toLowerCase().indexOf("msie 7.0")!=-1)?true:false;
   
   // specific browser shortcuts
   this.isNS4x = (this.isNS && this.versionMajor == 4);
   this.isNS40x = (this.isNS4x && this.versionMinor < 4.5);
   this.isNS47x = (this.isNS4x && this.versionMinor >= 4.7);
   this.isNS4up = (this.isNS && this.versionMinor >= 4);
   this.isNS6x = (this.isNS && this.versionMajor == 6);
   this.isNS6up = (this.isNS && this.versionMajor >= 6);
   this.isNS7x = (this.isNS && this.versionMajor == 7);
   this.isNS7up = (this.isNS && this.versionMajor >= 7);
   
   this.isIE4x = (this.isIE && this.versionMajor == 4);
   this.isIE4up = (this.isIE && this.versionMajor >= 4);
   this.isIE5x = (this.isIE && this.versionMajor == 5);
   this.isIE55 = (this.isIE && this.versionMinor == 5.5);
   this.isIE5up = (this.isIE && this.versionMajor >= 5);
   this.isIE6x = (this.isIE && this.versionMajor == 6);
   this.isIE7x = (this.isIE && ie7);
   this.isIE6up = (this.isIE && this.versionMajor >= 6);
   

   
   this.isIE4xMac = (this.isIE4x && this.isMac);
}

var browser = new BrowserDetect();
/*
if( !(browser.isIE6x || browser.isFirefox || browser.isFlock || browser.isCamino || browser.isSafari) ) {
	location = '/html_download.html';
}

*/
function shoot() {
    var getString = location.search;
    var getParams = getString.parseQuery();
    var tab = getParams['btnSearch'] ? getParams['btnSearch'] : gDefaultSearchBarrel;
    
    fadeaway(tab, false);
}

function swish(tab) {
    fadeaway(tab, true);
}

function fadeaway(tab, pfx) {
    and1( tab, $F('mainSearchField'), pfx );
}

function and1(tab, toSearch, pfx) {    
    if( !toSearch ) {
	score('/index?', {'btnSearch': tab} );
    } else {
	score('/search?', {'btnSearch': tab, 'searchText': toSearch}, pfx );
    }        
}

function score(page, getParams, pfx) {
    var getHash = $H(getParams);

    location = page+getHash.toQueryString()+(pfx ? '&pfx=pfx' : '');
}

function layup(e) {
    var code = new Event(e).getKeyCode();
    
    if( code == 13 ) {
	shoot();
	
	return false;
    } else {
	return true;
    }
}






function validateAndSubmit(searchForm) {
	if( !searchForm ) searchForm = 'searchForm';

	var searchText = Util.trim( document.forms[searchForm].searchText.value );
	
	if(searchText.length == 0){
		location = '/';
	} else {
		ajaxHandler.findMore(searchText);
	}
}

function checkEnter2(e, searchForm) {
	if( !searchForm ) searchForm = 'searchForm';

	var code = new Event(e).getKeyCode();

	if (code==13) {
		validateAndSubmit(searchForm);

		return false;
	} else{
		return true;
	}
}

function searchDrillDown(dig, query)
{
	var query = Util.trim(query);
	var queryLength = query.length;
	var checkQueryFlag = false;
	var checkAllFlag = false;
	for(i=0;i<queryLength;i++){
		if(query.charAt(i) == ":"){
			checkQueryFlag = true;
		}
	}
	
	if(checkQueryFlag){
		var querySplit = query.split(':');
		query = querySplit[1];
		if(querySplit[0] == "all")
		{
		 checkAllFlag = true;
		}
	}

	if(dig == "all"){
		checkAllFlag = true;
	}

	if(!checkAllFlag){
			query = dig+":"+query;
	}
	
	ajaxHandler.findMore(query);
}

function externalSearch(dig)
{
    
	var query = $('mainSearchField').value;
	var queryLength = query.length;
    var url;

    try {
		var cleanQuery = '';
		var termsArr = query.split(' ');
		for( var ii=0; ii < termsArr.length; ii++ ) {
			cleanQuery += termsArr[ii].replace(/.*:/gi, '') + '+';			
		}
		
    } catch(e) {

    }
	temp = cleanQuery.match("\"");
	if(temp != ""){
		cleanQuery = cleanQuery.replace(/\"/g, "");		
	} 
	query = cleanQuery;
		

    if(dig == "google") url = "http://images.google.com/images?q="+query;
    if(dig == "yahoo") url = "http://images.search.yahoo.com/search/images?p="+query;
    if(dig == "msn") url = "http://search.msn.com/images/results.aspx?q="+query;
    if(dig == "flickr") url = "http://www.flickr.com/search/?q="+query;

    location.href = url;
	
}

function expandMore(id)
{
    var more = "More &gt;&gt;";
    var less = "&lt;&lt; Less";
    
    var c; 
    if( id == "1") 
	    c = document.form1.chk_1.length;
    if( id == "5") 
	    c = document.form1.chk_5.length;
    if( id == "7") 
	    c = document.form1.chk_7.length;
    if( id == "14") 
	    c = document.form1.chk_14.length;
    if( id == "15") 
	    c = document.form1.chk_15.length;    
   
    if( $('showMoreLink'+id).innerHTML == less ) {
		$('showMoreLink'+id).innerHTML = more;
		
		for(i=6;i<c;i++){
			$('showMore'+id+'_'+i).style.display = 'none';

		}
	
    } else {
		
		$('showMoreLink'+id).innerHTML = less;
		
		for(i=6;i<c;i++){
			$('showMore'+id+'_'+i).style.display = 'block';

		}
    }
}

function digItFilter(dig,query,type)
{
	var filter = type;
	var digFilter;
	
	if(filter == "1") digFilter="album:"+dig;
	if(filter == "7") digFilter="person:"+dig;
	if(filter == "15") digFilter="tag:"+dig;
	if(filter == "14") digFilter="place:"+dig;
	if(filter == "5"){
		digFilter="daterange:";
		var a = dig.substring(5);
		var b = dig.substring(0,4);
		if(a == "January") dateRange = digFilter+b+"/1/1-"+b+"/1/31";
		if(a == "February") dateRange = digFilter+b+"/2/1-"+b+"/2/28";
		if(a == "March") dateRange = digFilter+b+"/3/1-"+b+"/3/31";
		if(a == "April") dateRange = digFilter+b+"/4/1-"+b+"/4/30";
		if(a == "May") dateRange = digFilter+b+"/5/1-"+b+"/5/31";
		if(a == "June") dateRange = digFilter+b+"/6/1-"+b+"/6/30";
		if(a == "July") dateRange = digFilter+b+"/7/1-"+b+"/7/31";
		if(a == "August") dateRange = digFilter+b+"/8/1-"+b+"/8/31";
		if(a == "September") dateRange = digFilter+b+"/9/1-"+b+"/9/30";
		if(a == "October") dateRange = digFilter+b+"/10/1-"+b+"/10/31";
		if(a == "November") dateRange = digFilter+b+"/11/1-"+b+"/11/30";
		if(a == "December") dateRange = digFilter+b+"/12/1-"+b+"/12/31";
		
		digFilter = dateRange;				 
	} else {
	    digFilter = "\""+digFilter+"\"";
	}

	queryFilter = query+" "+digFilter;
	ajaxHandler.findMoreNew(queryFilter,'','','','','',true);
}

function digItFilterCheck(e,dig,query,type)
{
	var digFilter;
	if(e.checked){
		digFilter = digItemFinder(type, dig);
		queryFilter = query+" "+digFilter;
		ajaxHandler.findMoreNew(queryFilter,'','','','','',true);
	}else{
		digFilter = digItemFinder(type, dig);
		re = new RegExp(digFilter, "gi");
		queryFilter=query.replace(re, "");
		ajaxHandler.findMoreNew(queryFilter,'','','','','',true);
	}
}

function digItemFinder(type, dig){
	var filter = type;
		var digFilter;
		if(filter == "1") digFilter="album:"+dig;
		if(filter == "7") digFilter="person:"+dig;
		if(filter == "15") digFilter="tag:"+dig;
		if(filter == "14") digFilter="place:"+dig;
		if(filter == "5"){
			digFilter="daterange:";
			var a = dig.substring(5);
			var b = dig.substring(0,4);
			if(a == "January") dateRange = digFilter+b+"/1/1-"+b+"/1/31";
			if(a == "February") dateRange = digFilter+b+"/2/1-"+b+"/2/28";
			if(a == "March") dateRange = digFilter+b+"/3/1-"+b+"/3/31";
			if(a == "April") dateRange = digFilter+b+"/4/1-"+b+"/4/30";
			if(a == "May") dateRange = digFilter+b+"/5/1-"+b+"/5/31";
			if(a == "June") dateRange = digFilter+b+"/6/1-"+b+"/6/30";
			if(a == "July") dateRange = digFilter+b+"/7/1-"+b+"/7/31";
			if(a == "August") dateRange = digFilter+b+"/8/1-"+b+"/8/31";
			if(a == "September") dateRange = digFilter+b+"/9/1-"+b+"/9/30";
			if(a == "October") dateRange = digFilter+b+"/10/1-"+b+"/10/31";
			if(a == "November") dateRange = digFilter+b+"/11/1-"+b+"/11/30";
			if(a == "December") dateRange = digFilter+b+"/12/1-"+b+"/12/31";
			
			digFilter = dateRange;				 
		} else {
			digFilter = "\""+digFilter+"\"";		    
		}

		return digFilter;
}

function riyaCookies(data,name){
	var select = DOM._getElement(data);	
	var temp =  select.options[select.selectedIndex].value;
	var value = temp.split("pageSize=");
	var cookieValue = value[1];
	 var today = new Date();
            var expire = new Date();
			nDays="180";
            document.cookie = name + '=' + escape(cookieValue) + ';'
            if (!(typeof nDays == 'undefined')) {
                if (!(nDays == null || nDays == 0)) {
                    expire.setTime(today.getTime() + 3600000 * 24 *
                    nDays);
                    document.cookie = name + "=" + escape(cookieValue)
                            + ";expires=" + expire.toGMTString() +
                            ";path=/";
                }
            }

			/*
			var dc = document.cookie;
            var prefix = name + "=";
            var begin = dc.indexOf("; " + prefix);
            if (begin == -1)
            {
                begin = dc.indexOf(prefix);
                if (begin != 0) return null;
            }
            else
            {
                begin += 2;
            }
            var end = document.cookie.indexOf(";", begin);
            if (end == -1)
            {
                end = dc.length;
            }
            alert(unescape(dc.substring(begin + prefix.length, end))); */
}

function MM_openBrWindow(theURL,winName,features) {
  window.open(theURL,winName,features);
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
/*  Prototype JavaScript framework, version 1.4.0
 *  (c) 2005 Sam Stephenson <sam@conio.net>
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.4.0',
  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',

  emptyFunction: function() {},
  K: function(x) {return x}
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.inspect = function(object) {
  try {
    if (object == undefined) return 'undefined';
    if (object == null) return 'null';
    return object.inspect ? object.inspect() : object.toString();
  } catch (e) {
    if (e instanceof RangeError) return '...';
    throw e;
  }
}

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}

Object.extend(Number.prototype, {
  toColorPart: function() {
    var digits = this.toString(16);
    if (this < 16) return '0' + digits;
    return digits;
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $R(0, this, true).each(iterator);
    return this;
  }
});

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0; i < arguments.length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}

/*--------------------------------------------------------------------------*/

function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}
Object.extend(String.prototype, {
  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(eval);
  },

  escapeHTML: function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
  },

  toQueryParams: function() {
    var pairs = this.match(/^\??(.*)$/)[1].split('&');
    return pairs.inject({}, function(params, pairString) {
      var pair = pairString.split('=');
      params[pair[0]] = pair[1];
      return params;
    });
  },

  toArray: function() {
    return this.split('');
  },

  camelize: function() {
    var oStringList = this.split('-');
    if (oStringList.length == 1) return oStringList[0];

    var camelizedString = this.indexOf('-') == 0
      ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
      : oStringList[0];

    for (var i = 1, len = oStringList.length; i < len; i++) {
      var s = oStringList[i];
      camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
    }

    return camelizedString;
  },

  inspect: function() {
    return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";
  }
});

String.prototype.parseQuery = String.prototype.toQueryParams;

var $break    = new Object();
var $continue = new Object();

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        try {
          iterator(value, index++);
        } catch (e) {
          if (e != $continue) throw e;
        }
      });
    } catch (e) {
      if (e != $break) throw e;
    }
  },

  all: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      result = result && !!(iterator || Prototype.K)(value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push(iterator(value, index));
    });
    return results;
  },

  detect: function (iterator) {
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(pattern, iterator) {
    var results = [];
    this.each(function(value, index) {
      var stringValue = value.toString();
      if (stringValue.match(pattern))
        results.push((iterator || Prototype.K)(value, index));
    })
    return results;
  },

  include: function(object) {
    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inject: function(memo, iterator) {
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.collect(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (value >= (result || value))
        result = value;
    });
    return result;
  },

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (value <= (result || value))
        result = value;
    });
    return result;
  },

  partition: function(iterator) {
    var trues = [], falses = [];
    this.each(function(value, index) {
      ((iterator || Prototype.K)(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator) {
    return this.collect(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.collect(Prototype.K);
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      iterator(value = collections.pluck(index));
      return value;
    });
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
}

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Object.extend(Array.prototype, Enumerable);

Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0; i < this.length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != undefined || value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(value.constructor == Array ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  indexOf: function(object) {
    for (var i = 0; i < this.length; i++)
      if (this[i] == object) return i;
    return -1;
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  shift: function() {
    var result = this[0];
    for (var i = 0; i < this.length - 1; i++)
      this[i] = this[i + 1];
    this.length--;
    return result;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  }
});
var Hash = {
  _each: function(iterator) {
    for (key in this) {
      var value = this[key];
      if (typeof value == 'function') continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  keys: function() {
    return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $H(hash).inject($H(this), function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  toQueryString: function() {
    return this.map(function(pair) {
      return pair.map(encodeURIComponent).join('=');
    }).join('&');
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  }
}

function $H(object) {
  var hash = Object.extend({}, object || {});
  Object.extend(hash, Enumerable);
  Object.extend(hash, Hash);
  return hash;
}
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    do {
      iterator(value);
      value = value.succ();
    } while (this.include(value));
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
      function() {return new XMLHttpRequest()}
    ) || false;
  },

  activeRequestCount: 0
}

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responderToAdd) {
    if (!this.include(responderToAdd))
      this.responders.push(responderToAdd);
  },

  unregister: function(responderToRemove) {
    this.responders = this.responders.without(responderToRemove);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (responder[callback] && typeof responder[callback] == 'function') {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) {}
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },

  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      parameters:   ''
    }
    Object.extend(this.options, options || {});
  },

  responseIsSuccess: function() {
    return this.transport.status == undefined
        || this.transport.status == 0
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  responseIsFailure: function() {
    return !this.responseIsSuccess();
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    var parameters = this.options.parameters || '';
    if (parameters.length > 0) parameters += '&_=';

    try {
      this.url = url;
      if (this.options.method == 'get' && parameters.length > 0)
        this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;

      Ajax.Responders.dispatch('onCreate', this, this.transport);

      this.transport.open(this.options.method, this.url,
        this.options.asynchronous);

      if (this.options.asynchronous) {
        this.transport.onreadystatechange = this.onStateChange.bind(this);
        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
      }

      this.setRequestHeaders();

      var body = this.options.postBody ? this.options.postBody : parameters;
      this.transport.send(this.options.method == 'post' ? body : null);

    } catch (e) {
      this.dispatchException(e);
    }
  },

  setRequestHeaders: function() {
    var requestHeaders =
      ['X-Requested-With', 'XMLHttpRequest',
       'X-Prototype-Version', Prototype.Version];

    if (this.options.method == 'post') {
      requestHeaders.push('Content-type',
        'application/x-www-form-urlencoded');

      /* Force "Connection: close" for Mozilla browsers to work around
       * a bug where XMLHttpReqeuest sends an incorrect Content-length
       * header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType)
        requestHeaders.push('Connection', 'close');
    }

    if (this.options.requestHeaders)
      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);

    for (var i = 0; i < requestHeaders.length; i += 2)
      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState != 1)
      this.respondToReadyState(this.transport.readyState);
  },

  header: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) {}
  },

  evalJSON: function() {
    try {
      return eval(this.header('X-JSON'));
    } catch (e) {}
  },

  evalResponse: function() {
    try {
      return eval(this.transport.responseText);
    } catch (e) {
      this.dispatchException(e);
    }
  },

  respondToReadyState: function(readyState) {
    var event = Ajax.Request.Events[readyState];
    var transport = this.transport, json = this.evalJSON();

    if (event == 'Complete') {
      try {
        (this.options['on' + this.transport.status]
         || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(transport, json);
      } catch (e) {
        this.dispatchException(e);
      }

      if ((this.header('Content-type') || '').match(/^text\/javascript/i))
        this.evalResponse();
    }

    try {
      (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
      Ajax.Responders.dispatch('on' + event, this, transport, json);
    } catch (e) {
      this.dispatchException(e);
    }

    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
    if (event == 'Complete')
      this.transport.onreadystatechange = Prototype.emptyFunction;
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
  initialize: function(container, url, options) {
    this.containers = {
      success: container.success ? $(container.success) : $(container),
      failure: container.failure ? $(container.failure) :
        (container.success ? null : $(container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function(transport, object) {
      this.updateContent();
      onComplete(transport, object);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.responseIsSuccess() ?
      this.containers.success : this.containers.failure;
    var response = this.transport.responseText;

    if (!this.options.evalScripts)
      response = response.stripScripts();

    if (receiver) {
      if (this.options.insertion) {
        new this.options.insertion(receiver, response);
      } else {
        Element.update(receiver, response);
      }
    }

    if (this.responseIsSuccess()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
document.getElementsByClassName = function(className, parentElement) {
  var children = ($(parentElement) || document.body).getElementsByTagName('*');
  return $A(children).inject([], function(elements, child) {
    if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      elements.push(child);
    return elements;
  });
}

/*--------------------------------------------------------------------------*/

if (!window.Element) {
  var Element = new Object();
}

Object.extend(Element, {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      Element[Element.visible(element) ? 'hide' : 'show'](element);
    }
  },

  hide: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      element.style.display = 'none';
    }
  },

  show: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      element.style.display = '';
    }
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
  },

  update: function(element, html) {
    $(element).innerHTML = html.stripScripts();
    setTimeout(function() {html.evalScripts()}, 10);
  },

  getHeight: function(element) {
    element = $(element);
    return element.offsetHeight;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    return Element.classNames(element).include(className);
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    return Element.classNames(element).add(className);
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    return Element.classNames(element).remove(className);
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    for (var i = 0; i < element.childNodes.length; i++) {
      var node = element.childNodes[i];
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        Element.remove(node);
    }
  },

  empty: function(element) {
    return $(element).innerHTML.match(/^\s*$/);
  },

  scrollTo: function(element) {
    element = $(element);
    var x = element.x ? element.x : element.offsetLeft,
        y = element.y ? element.y : element.offsetTop;
    window.scrollTo(x, y);
  },

  getStyle: function(element, style) {
    element = $(element);
    var value = element.style[style.camelize()];
    if (!value) {
      if (document.defaultView && document.defaultView.getComputedStyle) {
        var css = document.defaultView.getComputedStyle(element, null);
        value = css ? css.getPropertyValue(style) : null;
      } else if (element.currentStyle) {
        value = element.currentStyle[style.camelize()];
      }
    }

    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
      if (Element.getStyle(element, 'position') == 'static') value = 'auto';

    return value == 'auto' ? null : value;
  },

  setStyle: function(element, style) {
    element = $(element);
    for (name in style)
      element.style[name.camelize()] = style[name];
  },

  getDimensions: function(element) {
    element = $(element);
    if (Element.getStyle(element, 'display') != 'none')
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = '';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = 'none';
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return;
    element._overflow = element.style.overflow;
    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
      element.style.overflow = 'hidden';
  },

  undoClipping: function(element) {
    element = $(element);
    if (element._overflow) return;
    element.style.overflow = element._overflow;
    element._overflow = undefined;
  }
});

var Toggle = new Object();
Toggle.display = Element.toggle;

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(element);
    this.content = content.stripScripts();

    if (this.adjacency && this.element.insertAdjacentHTML) {
      try {
        this.element.insertAdjacentHTML(this.adjacency, this.content);
      } catch (e) {
        if (this.element.tagName.toLowerCase() == 'tbody') {
          this.insertContent(this.contentFromAnonymousTable());
        } else {
          throw e;
        }
      }
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.insertContent([this.range.createContextualFragment(this.content)]);
    }

    setTimeout(function() {content.evalScripts()}, 10);
  },

  contentFromAnonymousTable: function() {
    var div = document.createElement('div');
    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
    return $A(div.childNodes[0].childNodes[0].childNodes);
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },

  insertContent: function(fragments) {
    fragments.reverse(false).each((function(fragment) {
      this.element.insertBefore(fragment, this.element.firstChild);
    }).bind(this));
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.appendChild(fragment);
    }).bind(this));
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment,
        this.element.nextSibling);
    }).bind(this));
  }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set(this.toArray().concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set(this.select(function(className) {
      return className != classNameToRemove;
    }).join(' '));
  },

  toString: function() {
    return this.toArray().join(' ');
  }
}

Object.extend(Element.ClassNames.prototype, Enumerable);
var Field = {
  clear: function() {
    for (var i = 0; i < arguments.length; i++)
      $(arguments[i]).value = '';
  },

  focus: function(element) {
    $(element).focus();
  },

  present: function() {
    for (var i = 0; i < arguments.length; i++)
      if ($(arguments[i]).value == '') return false;
    return true;
  },

  select: function(element) {
    $(element).select();
  },

  activate: function(element) {
    element = $(element);
    element.focus();
    if (element.select)
      element.select();
  }
}

/*--------------------------------------------------------------------------*/

var Form = {
  serialize: function(form) {
    var elements = Form.getElements($(form));
    var queryComponents = new Array();

    for (var i = 0; i < elements.length; i++) {
      var queryComponent = Form.Element.serialize(elements[i]);
      if (queryComponent)
        queryComponents.push(queryComponent);
    }

    return queryComponents.join('&');
  },

  getElements: function(form) {
    form = $(form);
    var elements = new Array();

    for (tagName in Form.Element.Serializers) {
      var tagElements = form.getElementsByTagName(tagName);
      for (var j = 0; j < tagElements.length; j++)
        elements.push(tagElements[j]);
    }
    return elements;
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name)
      return inputs;

    var matchingInputs = new Array();
    for (var i = 0; i < inputs.length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) ||
          (name && input.name != name))
        continue;
      matchingInputs.push(input);
    }

    return matchingInputs;
  },

  disable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.blur();
      element.disabled = 'true';
    }
  },

  enable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.disabled = '';
    }
  },

  findFirstElement: function(form) {
    return Form.getElements(form).find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    Field.activate(Form.findFirstElement(form));
  },

  reset: function(form) {
    $(form).reset();
  }
}

Form.Element = {
  serialize: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter) {
      var key = encodeURIComponent(parameter[0]);
      if (key.length == 0) return;

      if (parameter[1].constructor != Array)
        parameter[1] = [parameter[1]];

      return parameter[1].map(function(value) {
        return key + '=' + encodeURIComponent(value);
      }).join('&');
    }
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter)
      return parameter[1];
  }
}

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return Form.Element.Serializers.textarea(element);
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked)
      return [element.name, element.value];
  },

  textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    return Form.Element.Serializers[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
      opt = element.options[index];
      value = opt.value;
      if (!value && !('value' in opt))
        value = opt.text;
    }
    return [element.name, value];
  },

  selectMany: function(element) {
    var value = new Array();
    for (var i = 0; i < element.length; i++) {
      var opt = element.options[i];
      if (opt.selected) {
        var optValue = opt.value;
        if (!optValue && !('value' in opt))
          optValue = opt.text;
        value.push(optValue);
      }
    }
    return [element.name, value];
  }
}

/*--------------------------------------------------------------------------*/

var $F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $(element);
    this.callback  = callback;

    this.lastValue = this.getValue();
    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    var elements = Form.getElements(this.element);
    for (var i = 0; i < elements.length; i++)
      this.registerCallback(elements[i]);
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        case 'password':
        case 'text':
        case 'textarea':
        case 'select-one':
        case 'select-multiple':
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,

  element: function(event) {
    return event.target || event.srcElement;
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0; i < Event.observers.length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.attachEvent))
      name = 'keydown';

    this._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.detachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      element.detachEvent('on' + name, observer);
    }
  }
});

/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  clone: function(source, target) {
    source = $(source);
    target = $(target);
    target.style.position = 'absolute';
    var offsets = this.cumulativeOffset(source);
    target.style.top    = offsets[1] + 'px';
    target.style.left   = offsets[0] + 'px';
    target.style.width  = source.offsetWidth + 'px';
    target.style.height = source.offsetHeight + 'px';
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent==document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      valueT -= element.scrollTop  || 0;
      valueL -= element.scrollLeft || 0;
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },

  absolutize: function(element) {
    element = $(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';;
    element.style.left   = left + 'px';;
    element.style.width  = width + 'px';;
    element.style.height = height + 'px';;
  },

  relativize: function(element) {
    element = $(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}
/**
 *
 * A class for manipulating DOM elements
 *
 */
function DOM() {
}
DOM.MSXML_CLSID = "Msxml2.XMLHTTP";
DOM.DOM_CLSID = "Msxml2.DOMDocument";
/**
 *
 * Return all elements of a CSS class
 *
 */
DOM.getElementsByClassName = function(div,className) {
	div = DOM._getElement(div);
	
	var children = div.getElementsByTagName('*');
	var elements = new Array();
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var classNames = child.className.split(' ');
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elements.push(child);
				break;
			}
		}
	}
	return elements;
};
DOM.getFirstElementByClassName = function(div,className) {
	div = DOM._getElement(div);
	
	var children = div.getElementsByTagName('*');
	var elm = null;
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var classNames = child.className.split(' ');
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elm = child;
				break;
			}
		}
		
		if( elm ) {
			break;
		}
	}
	
	return elm;
};
DOM.getElementsByTagName = function(div, tagName) {
	div = DOM._getElement(div);
	
	return div.getElementsByTagName(tagName);
};
DOM.getFirstElementByTagName = function(div, tagName) {
	return DOM.getElementsByTagName(div, tagName)[0];
};
/**
 *
 * Show a DIV
 *
 */
DOM.show = function(div) {
	this._setDivDisplay( "block", div );
};
DOM.showInline = function(div) {
	this._setDivDisplay( "inline", div );
};
/**
 *
 * Hide a DIV
 *
 */
DOM.hide = function(div) {
	this._setDivDisplay( "none", div );
};
DOM.toggleDisplay = function(div) {
	div = DOM._getElement(div);
	
	if( !div.style.display ) {
		DOM.show( div );
	} else if( div.style.display != "none" ) {
		DOM.hide( div );
	} else {
		DOM.show( div );
	}
};
/**
 *
 * Parse out # pixels from CSS text
 *
 */
DOM.parsePx = function(pixels) {
	return pixels.replace('px','').replace('pt','')*1;
};
DOM._setDivDisplay = function(style, div) {
	div = DOM._getElement(div);
	if( div ) {
		div.style.display = style;	
	}
};
/**
 *
 * Get the vertical scrollbar position
 *
 */
DOM.getScrollTo = function() {
    return document.body ? document.body.scrollTop : window.pageYOffset;
};
DOM.getWindowEdge = function() {
    return document.body ? document.body.scrollTop+document.body.clientHeight-15 : window.pageYOffset+window.innerHeight-18;
};
DOM.getViewportHeight = function() {
	return document.body ? document.body.clientHeight-15 : window.pageYOffset+window.innerHeight-18;
};
/**
 *
 * Set the cross-browser opacity of a DIV
 *
 */
DOM.setOpacity = function( div, opacityFactor ) {
	div = DOM._getElement(div);
	with( div.style ) {
		MozOpacity = opacityFactor;
		opacity = opacityFactor;
		filter = "alpha(opacity=" + (opacityFactor*100) + ")";
	}
};
/**
 *
 * Get the cross-browser body element
 *
 */
DOM.getBody = function() {
	return (document.body ? document.body : document.documentElement);
};
/**
 *
 * Add an event listener
 *
 */
DOM.addEventListener = function( target, type, handler ) {
	target = DOM._getElement(target);
	
	if ( document.addEventListener ) {
		target.addEventListener( type, handler, false );
	} else if (document.attachEvent) {
		type = "on" + type;
		target.attachEvent( type, handler );
	} else {
		type = "on" + type;
		target[type] = handler;
	}
};
/**
 *
 * Remove an event listener
 *
 */
DOM.removeEventListener = function( target, type, handler ) {
	target = DOM._getElement(target);
	if ( document.removeEventListener ) {
		target.removeEventListener( type, handler, false );
	} else if (document.detachEvent) {
		type = "on" + type;
		target.detachEvent( type, handler );
	} else {
		type = "on" + type;
		target[type] = null;
	}
};
/**
 *
 * Create a blank XML Document
 *
 */
DOM.createDocument = function() {
	var doc = '';
	if( window.ActiveXObject ) {
	
		doc = new ActiveXObject( DOM.DOM_CLSID );
	
	} else {
	
		doc = document.implementation.createDocument("","",null);
	
	}
	
	doc.async = false;
	
	return doc;
};
DOM.convertXmlToString = function( xmlDoc ) {
	if( window.ActiveXObject ) {
		return xmlDoc.xml;
	} else {
		return (new XMLSerializer()).serializeToString(xmlDoc);
	}
};
DOM.getXmlHttp = function() {
	if( window.ActiveXObject ) {
		return new ActiveXObject( DOM.MSXML_CLSID );
	} else {
		return new XMLHttpRequest();
	}
};
DOM.equalsIgnoreCase = function( arg1, arg2 ) {
	return arg1.toLowerCase() == arg2.toLowerCase();
};
DOM._getElement = function(elm) {
	if( typeof elm == 'object' ) {
		return elm;
	} else {
		return document.getElementById(elm);
	}
};
DOM.setVisible = function( div, isVisible ) {
	DOM._getElement(div).style.visibility = isVisible ? 'visible' : 'hidden';
};
DOM.setImgSrc = function(img, src) {
	DOM._getElement(img).src = src;
};
DOM.getValue = function(input) {
	return DOM._getElement(input).value;
};
DOM.setValue = function(input, value) {
	DOM._getElement(input).value = value;
};
DOM.getInnerHTML = function(elm) {
	return DOM._getElement(elm).innerHTML;
};
DOM.setInnerHTML = function(elm, innerHTML) {
	DOM._getElement(elm).innerHTML = innerHTML;
};
DOM.setHref = function(a, href) {
	DOM._getElement(a).href = href;
};
DOM.getSelected = function(select) {
	var select = DOM._getElement(select);
	
	return select.options[select.selectedIndex].innerHTML;
};
DOM.getSelectedValue = function(select) {
	var select = DOM._getElement(select);
	
	return select.options[select.selectedIndex].value;
};
DOM.getAncestorOfClass = function(div, className) {
        var container = div;
	while( !DOM.equalsIgnoreCase((container.className ? container.className : ''), className) ) {
		container = container.parentNode;
	}
	
	return container;
};
DOM.getAncestorOfType = function(div, nodeName ) {
	var container = div;
	while( !DOM.equalsIgnoreCase(container.nodeName, nodeName) ) {
		container = container.parentNode;
	}
	
	return container;
};
DOM.exists = function(div) {
	return DOM._getElement(div);
};
DOM.getContentScrollTo = function() {
	if( Util.isIe6() ) {
		return document.getElementById('content').scrollTop;
	} else {
		return DOM.getScrollTo();
	}
};
DOM.incrementContentScrollTo = function(incr) {
	if( Util.isIe6() ) {
		var currScrollTop = document.getElementById('content').scrollTop;
		document.getElementById('content').scrollTop = currScrollTop + incr;
	} else {
		var currScrollTo = DOM.getScrollTo();			
		self.scrollTo( 0, currScrollTo + incr );
	}
};
/*
 * Utility class.  Address Book methods pre-suppose the existence of global
 * hashEmails, hashNames, arrayEmails, arrayNames
 */
function Util() {

}
Util.months = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
Util.PERMISSION_COOKIE = 'riyaSearchTab';

Util.setCookie = function(name, value, expires, path, domain, secure) {
    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
};

Util.getCookie = function(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else {
        begin += 2;
    }

    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
        end = dc.length;
    }

    return unescape(dc.substring(begin + prefix.length, end));
};

Util.deleteCookie = function(name, path, domain) {
    if( Util.getCookie(name) ) {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
};

Util.min = function( a, b ) {
	return ( a < b ? a : b );
};

Util.max = function( a, b ) {
	return ( a > b ? a : b );
};

Util.isIe6 = function() {
	return ( navigator.userAgent.indexOf("MSIE 6.0") >= 0 );
};

Util.isMac = function() {
	return ( navigator.userAgent.toLowerCase().indexOf("mac") >= 0 );
};

Util.getHideSimpleTrainingPopup = function() {
	return Util.getCookie('ojosHideSimpleTrainingPopup');
};

Util.setHideSimpleTrainingPopup = function() {
	if( Util.getHideSimpleTrainingPopup() ) {
		Util.deleteCookie('ojosHideSimpleTrainingPopup');
	} else {
		Util._setPermanentCookie( 'ojosHideSimpleTrainingPopup', 'hide' );
	}
};

Util.clearHideUscConfirmation = function() {
	Util.deleteCookie("ojosHideUscConfirmation");
};

Util.getHideUscConfirmation = function() {
	return Util.getCookie("ojosHideUscConfirmation");
};

Util.setHideUscConfirmation = function() {
	Util._setPermanentCookie( "ojosHideUscConfirmation", "hide" );
};

Util._setPermanentCookie = function( name, value ) {
	Util.setCookie( name, value, new Date("July 14, 2012") );
};

Util.getNoCacheUrl = function(url) {
	var rand = Math.random();
	
	return url + '&r=' + rand;
};

Util.isEmailFormatValid = function(email) {
	var emailRegex =  '^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)([A-Za-z])$';
	return(email.match(emailRegex));       
};

Util.blank = function() {

};  

Util.startRecognizedAnimation = function() {
	if( DOM.exists('recognizedAnim') ) {
			DOM.setImgSrc('recognizedAnim', '/images/anim-c.gif');

			try {
					setTimeout( function() { Util.stopRecognizedAnimation() }, 30000 );

					Util.setCookie( 'riyaRecognizedAnimation', 'yes' );
			} catch(e) {

			}
	}
};

Util.checkRecognizedAnimation = function() {
    return Util.getCookie('riyaRecognizedAnimation');
};

Util.stopRecognizedAnimation = function() {
    if( DOM.exists('recognizedAnim') ) {
        DOM.setImgSrc('recognizedAnim', '/images/spacer.gif');

        if( Util.checkRecognizedAnimation() ) {
            Util.deleteCookie('riyaRecognizedAnimation');
        }
    }
};

Util.poll = function() {
    if( DOM.exists('recognizedAnim') ) {
/*
        if( DOM.getInnerHTML('unrecognizedNr')*1 < 25 ) {
            DOM.setImgSrc('unrecognizedAnim', '/images/anim-c.gif');

            if( DOM.exists('totalPhotosAnim') ) {
                DOM.setImgSrc( 'totalPhotosAnim', '/images/anim-c.gif' );
            }
        }
 */
        setInterval( function(){ ajaxHandler.getUnrecognizedCounter() }, 600000 );

        if( Util.checkRecognizedAnimation() ) {
            Util.startRecognizedAnimation();
        }
    }
};

Util.trim  = function(sString) {
  if(!sString) {
		return sString;
	}
  
  while (sString.substring(0,1) == ' ') {
    sString = sString.substring(1, sString.length);
  }
  
  while (sString.substring(sString.length-1, sString.length) == ' ') {
    sString = sString.substring(0,sString.length-1);
  }
  
 return sString.replace(/^\s+|\s+$/, '');

};

Util.addKeyScroll = function(handle) {
	if( Util.isIe6() ) {
		if( !document.onkeydown ) {
			document.onkeydown = handle;
		}
	} else {
		if( !document.onkeypress ) {
			document.onkeypress = handle;
		}
	}
};

Util.removeKeyScroll = function() {
	if( Util.isIe6() ) {
		document.onkeydown = '';
	} else {
		document.onkeypress = '';
	}
};

Util.setEmail = function(select) {
	var email = select.options[select.selectedIndex].value;
	var field = document.getElementById('select_msgShare_email');
	
	if( select.selectedIndex > 0 ) {
		if( !email ) {
			field.removeAttribute('disabled');
			field.value = '<please enter an email address>';
		} else {
			field.value = email;	
			field.setAttribute('disabled', 'disabled');		
		}
	} else {
		field.value = '';
		field.setAttribute('disabled', 'disabled');		
	}	
};

Util.isNameValid = function (name){
	var nameRegex = '^[a-zA-Z0-9\'\\-\\.\\s][a-zA-Z0-9\'\\-\\.\\s]*$';
	
	return name.match(nameRegex) ? true : false;
};

Util.isTimeStampValid = function (timeStamp){
	var timeStampRegex =  "^\\s*[0-9]{4}:[0-9]{1,2}:[0-9]{1,2}\\s*[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\\s*$";

	return timeStamp.match(timeStampRegex) ? true : false;
};

Util.pinMyFriendsPhotos = function() {
	Util.setCookie(Util.PERMISSION_COOKIE, gPermissionFriends);
};

Util.pinMyPhotos = function() {
	Util.setCookie(Util.PERMISSION_COOKIE, gPermissionPrivate);
};

Util.pinEveryonesPhotos = function() {
	Util.setCookie(Util.PERMISSION_COOKIE, gPermissionPublic);
};

Util.getTab = function() {
	var cookie = Util.getCookie( Util.PERMISSION_COOKIE );
	
	return cookie == null ? '' : cookie+'';
};

Util.getNameForEmail = function(email) {
	return hashEmails[email];
};

Util.getEmailForName = function(name) {
	var email = hashNames[name];
	
	return email.substr(0,1) == '@' ? '' : email;
};

Util.contactExists = function(name, email) {
	return Util.nameExists(name) || Util.emailExists(email, name);
};

Util.nameExists = function(name) {
	return hashNames[Util._normalizeName(name)];
};

Util.emailExists = function(email, name) {
	return hashEmails[Util._normalizeEmail(email, name)];
};

Util.addressNotValid = function(name, email, weakValidation) {
	var errorMsg = Util.nameNotValid(name, weakValidation);
	
	if( !errorMsg ) {
		errorMsg = Util.emailNotValid(email, name);
	}
	
	return errorMsg;
};

Util.nameNotValid = function(name, weakValidation) {
	name = Util._normalizeWord(name);

	var errorMsg = '';

	if( name.length <= 0 && !weakValidation ) {
		errorMsg = 'Please provide a name.';
	}

	if( name.length > 0 && !Util.isNameValid(name) ){
		errorMsg = 'Name can contain only alphanumeric characters, periods, hyphens and apostrophes.';
	}
	
	return errorMsg;
};

Util.emailNotValid = function(email, name) {
	email = Util._normalizeWord(email);
	name = Util._normalizeWord(name);
	
	var errorMsg = '';

	if( email.length > 0 && !Util.isEmailFormatValid(email) ){
		errorMsg = email + ' is not a valid email address. Please enter a valid email address.';
	}	
	
	return errorMsg;
};

Util.trackAddress = function(name, email) {
	var origName = name;
	
	name = Util._normalizeName(name);
	email = Util._normalizeEmail(email, name);
	
	var i = 0;
	if( !hashNames[name] && arrayNames.length > 0 ) {
		while( Util._normalizeName(arrayNames[i]) < name ) {
			i++;
			
			if( i >= arrayNames.length ) break;
		}
		
		if( i > 0 ) {
			arrayNames.splice( i-1, 1, arrayNames[i-1], origName );
 		} else {
			arrayNames.splice( 0, 0, origName );
    }
	}

	hashNames[name] = email;
	
	if( !hashEmails[email] ) {
		i = 0;
		while( arrayEmails[i] < email ) {
			i++;

			if( i >= arrayEmails.length ) break;
		}

		if( i > 0 ) {
			arrayEmails.splice( i-1, 1, arrayEmails[i-1], email );
 		} else {
			arrayEmails.splice( 0, 0, email );
    }
	}

	hashEmails[email] = origName;
};

Util.removeAddress = function(name, email) {
	name = Util._normalizeName(name);
	email = Util._normalizeEmail(email, name);
	
	var i = 0;
	if( hashNames[name] ) {
		hashNames[name] = '';

		i = 0;
		while( Util._normalizeName( arrayNames[i] ) < name ) {
			i++;
			
			if( i >= arrayNames.length ) break;			
		}
		arrayNames.splice( i, 1 );
	}

	if( hashEmails[email] ) {
		hashEmails[email] = '';

		i = 0;
		while( arrayEmails[i] < email ) {
			i++;
			
			if( i >= arrayEmails.length ) break;
		}
		arrayEmails.splice( i, 1 );
	}
};

Util._normalizeName = function(name) {
	return Util._normalizeWord(name);
};

Util._normalizeEmail = function(email, name) {
	if( !email ) {
		return '@' + Util._normalizeName(name);
	} else {
		return Util._normalizeWord(email);
	}
};

Util._normalizeWord = function(word) {
	return Util.trim(word).toLowerCase();
};

Util.toSafeString = function(str) {
	return str.replace('\'', '_QUOTE_').replace('"', '_DQUOTE_');
};

Util.revertSafeString = function(str) {
	return str.replace(/\_QUOTE\_/gi, '\'').replace(/\_DQUOTE\_/gi, '"');
};

Util.getNameIdx = function(name) {
	name = Util._normalizeName(name);

	var i = 0;
	while( Util._normalizeName( arrayNames[i] ) < name ) {
		i++;

		if( i >= arrayNames.length ) {
			i = -9999;

			break;
		}
	}

	return i;
};

Util.shorten = function(str, by) {
	if( !str ) {
		return '';
	}

	return str.length > by ? str.substring(0, by-3)+"..." : str;
};


Util.isDateValid = function(year,month,day)
{
  if(!((year) || (month) || (day)))
    return;
  
  
  if((!year) )
    return 'Please select Year';
  if((!month) )
    return 'Please select Month';
  if((!day) )
    return 'Please select Day';
   
  var isLeap ;
  var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  if(month == 1)
  {
    isLeap = Util.isLeapYear(year);
    if(isLeap)
    {
      monthDays[1] = 29;
    }
  }
  if(!(day < monthDays[month] + 1 ))
    return Util.months[month] + " doesn't have " + "'" + day + "'" + " days";
  else
    return;
  };

  Util.isLeapYear = function(year)
  {
    if(year%4==0 && ((!(year %100 ==0)) || year % 400 == 0)) 
      return true;
    else
      return false;
  }

  Util.isFutureDate = function(year,month,day)
  {
	var dt = new Date();
	dt.setFullYear(year);
	dt.setMonth(month);
	dt.setDate(day);
	if(new Date() < dt)
		return true	;
	else
		return false;

  }

//usa format
Util.isValidZip = function(zipcode){
var badZip = false;
if(isNaN(zipcode)){
	var k = new Array("1","2","3","4","5","6","7","8","9","0","-");
	for (var i=0;i<zipcode.length;i++)
	{
		temp = zipcode.charAt(i)
		if((isNaN(temp)) && (temp != "-") ){
			 badZip = true;
						
		}		
	}
}
if(zipcode.length == 0)
       badZip = false;
else
{
	if(zipcode.length < 5 ) badZip = true;
	if(zipcode.length > 10 ) badZip = true;
	if(zipcode.length > 5 ) {
		if(zipcode.charAt(5) != "-") badZip = true;
		}
}
return badZip;
}
/**
 *
 * A class for handling cross-browser events
 *
 */
function Event(e) {
	this.e = (e) ? e : (window.event) ? window.event : null;
};
/**
 *
 * Get event target from DOM
 *
 */
Event.prototype.getTarget = function() {
	var e = this.e;
	return (e.target) ? e.target : (e.srcElement) ? e.srcElement : null;
};
/**
 *
 * Get X mouse position of event
 *
 */
Event.prototype.getX = function() {
	var e = this.e;
	return (e.pageX) ? e.pageX : (document.documentElement.scrollLeft) ? (document.documentElement.scrollLeft + e.clientX) : (document.body.scrollLeft) ? (document.body.scrollLeft + e.clientX) : e.clientX;
};
Event.prototype.getLayerX = function() {
	var e = this.e;
	
	return e.layerX ? e.layerX : e.offsetX;
};
/**
 *
 * Get Y mouse position of event
 *
 */
Event.prototype.getY = function() {
	var e = this.e;
	return (e.pageY) ? e.pageY : (document.documentElement.scrollTop) ? (document.documentElement.scrollTop + e.clientY) : (document.body.scrollTop) ? (document.body.scrollTop + e.clientY) : e.clientY;
};
Event.prototype.getLayerY = function() {
	var e = this.e;
	
	return e.layerY ? e.layerY : e.offsetY;
};
/**
 *
 * Cancel event propagation
 *
 */
Event.prototype.cancelBubble = function() {
	var e = this.e;
	if (!e) return;
	
	if (e.stopPropagation) {
	
		e.stopPropagation();
		e.preventDefault();
	
	} else if (typeof e.cancelBubble != undefined) {
	
		e.cancelBubble = true;
		e.returnValue = false;
	
	} else {
	
		return false;
		e = null;
	
	}
};
/*
 * Get the ASCII code corresponding to a keydown/keypress
 */
Event.prototype.getKeyCode = function() {
    var keyCode = this.e.keyCode;
    var charCode = this.e.charCode;
    
    return (keyCode ? keyCode : charCode);
};

Event.prototype.ctrlKey = function() {
    return this.e.ctrlKey;
};

Event.prototype.isEnter = function() {
    return this.getKeyCode() == 13;
};
function Overlay(imageId, overlayId, faceNr, isOwner,isManualFace) {
	this.imageId = imageId;
	this.overlayId = overlayId;
	this.faceNr = faceNr;
	this.isOwner = isOwner;
	this.isManualFace =  isManualFace;
}
function Drawing( canvas, overlay, overlayPosX, overlayPosY ) {
	this.canvas = '';
	this.overlay = '';
	this.posX = '';
	this.posY = '';
	
	this.locked = false;
}

Drawing.prototype.load = function( canvas, overlay, posX, posY ) {
	this.canvas = canvas;
	this.overlay = overlay;
	this.posX = posX;
	this.posY = posY;
}

Drawing.prototype.onload = function() {
	this.attachMouseoverListeners();
};

Drawing.prototype.mousedownDraw = function(e) {		
	var event = new Event(e);
	var canvas = event.getTarget().parentNode;
	var posX = event.getLayerX();
	var posY = event.getLayerY();	
	
	drawing._mousedownDraw( canvas, posX, posY );
};

Drawing.prototype._mousedownDraw = function( canvas, posX, posY ) {
	if( !this.locked ) {
		this.lock();

		active.hideAllBut();

		DOM.addEventListener( canvas, "mousemove", this.mousemoveDraw );
		DOM.addEventListener( canvas, "mouseup", this.mouseupDraw );

		var overlay = document.createElement("div");

		with( overlay.style ) {
			position = 'absolute';
			top = posY+'px';
			left = posX+'px';
			width = '0px';
			height = '0px';
			border = "2px solid #FF0000";
		}

		canvas.appendChild( overlay );

		this.load( canvas, overlay, posX, posY );
	}
};

Drawing.prototype.mousemoveDraw = function(e) {
	var event = new Event(e);
	event.cancelBubble();

	var target = event.getTarget();
	var newX = event.getLayerX();
	var newY = event.getLayerY();

	drawing._mousemoveDraw( target, newX, newY );	
};

Drawing.prototype._mousemoveDraw = function( target, newX, newY ) {
	if( !this.isCanvas(target) ) {
		return;
	}

	var newW = newX - this.posX - 15;
	var newH = newY - this.posY - 15;

	with( this.overlay.style ) {
		if( newW < 0 ) {
			left = newX - 15;
		}

		if( newH < 0 ) {
			top = newY - 15;
		}
	
		newW = Math.abs( newW );
		newH = Math.abs( newH );
	
		width = newW+'px';
		height = newH+'px';
	}
};

Drawing.prototype.mouseupDraw = function(e) {
	var event = new Event(e);
	event.cancelBubble();
	
	drawing._mouseupDraw();
};

Drawing.prototype._mouseupDraw = function() {
	DOM.removeEventListener( this.canvas, "mousemove", this.mousemoveDraw );
	DOM.removeEventListener( this.canvas, "mouseup", this.mouseupDraw );
	
	var newOverlayWidth = DOM.parsePx(this.overlay.style.width);
	
	if( newOverlayWidth < 20 ) {
		this.canvas.removeChild( this.overlay );
		
		active.showAll();
		
		this.canvas = '';
		this.overlay = '';
	} else {
		this.canvas.removeChild( this.overlay );
		
		active.addOverlay(this.overlay, this.canvas);

		this.canvas = '';
		this.overlay = '';
	}
	
	this.unlock();
};

Drawing.prototype.mouseoverHide = function(e) {
	drawing._mouseoverHide();
};

Drawing.prototype._mouseoverHide = function() {
	if( !this.locked ) {
		DOM.hide('overlayCanvas');
	}
};

Drawing.prototype.mouseoverShow = function(e) {
	var event = new Event(e);
	var target = event.getTarget();
	
	drawing._mouseoverShow(target);
};

Drawing.prototype._mouseoverShow = function(target) {
	if( !this.locked ) {
		DOM.show('overlayCanvas');

		active.processOverlays(target);
	}
};

Drawing.prototype.attachMouseoverListeners = function() {
	
	// clean out existing garbage
	DOM.removeEventListener( 'imageContainer', 'mouseover', this.mouseoverShow );
	DOM.removeEventListener( 'imageContainer', 'mouseout', this.mouseoverHide );
	DOM.removeEventListener( 'overlayCanvasScreen', 'mouseout', this.mouseoverHide );
	
	//if( gIsLoggedIn ) {
		DOM.removeEventListener( 'overlayCanvasScreen', "mousedown", this.mousedownDraw );
	//}

	// add it back
	DOM.addEventListener( 'imageContainer', 'mouseover', this.mouseoverShow );
	DOM.addEventListener( 'imageContainer', 'mouseout', this.mouseoverHide );
	DOM.addEventListener( 'overlayCanvasScreen', 'mouseout', this.mouseoverHide );
	
	//if( gIsLoggedIn ) {
		DOM.addEventListener( 'overlayCanvasScreen', "mousedown", this.mousedownDraw );
	//}
	
	
	if( Util.isIe6() && !active.slideOn ) {
		this._mouseoverShow(document.getElementById('screenResImg'));
	}
};

Drawing.prototype.isCanvas = function(div) {
	return DOM.equalsIgnoreCase(div.id, 'overlayCanvasScreen');
};

Drawing.prototype.lock = function() {
	this.locked = true;
};

Drawing.prototype.unlock = function() {
	this.locked = false;
};

Drawing.prototype.toggleLock = function() {
	this.locked = !this.locked;
};
function Alert() {
	this.selects = '';
	this.opened = false;
}

Alert.prototype.simpleTrainingPopup = function() {
	this._alertXS('');

	this._setContentXS( 
		 "<div style=\"margin-top:-30px;margin-left:15px\" align=\"left\">"
		+"	<img src=\"images/hints-st.gif\" width=\"278\" height=\"137\"/><br/>"
		+"	<input type=\"checkbox\" onclick=\"Util.setHideSimpleTrainingPopup()\"> Don\'t show me these hints again"
		+"</div>"
	);
};

Alert.prototype.confirmYesNo = function(url, message) {
	this._alertXS('Riya Asks:');
	
	var url = '/yesno?message='+message+'&url='+escape(url);
	
	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentXS( xmlHttp.responseText );
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);	
};

Alert.prototype.inherit = function( name, email, imageId, faceNr ) {
	if( !email ) {
		var url = '/inherit'
			+ '?identifiedUserEmail=' + email
			+ '&identifiedUserName=' + name.replace(/\s/gi, '_SPACE_')
			+ '&imageId=' + imageId
			+ '&faceNumber=' + faceNr;

		var rexeeUrl = ajaxHandler.getRexeeDomain( url, 'html' );

		this._alertXL('Results for ' + name);

		var xmlHttp = DOM.getXmlHttp();

		var a = this;
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
					if( xmlHttp.responseText > '' ) {
						a._setContentXL( xmlHttp.responseText );
					}
				}
			}
		}	

		xmlHttp.open("GET", Util.getNoCacheUrl(rexeeUrl), true);
		xmlHttp.send(null);
	}
};

Alert.prototype.shareSubmit = function(action) {
	var select = document.getElementById('select_msgShare');
	var emailField = document.getElementById('select_msgShare_email');	
	var emailTo = emailField.value.toLowerCase();	
	var faceId = select.options[select.selectedIndex].id;
	var contactId = select.options[select.selectedIndex].className;
	var name = select.options[select.selectedIndex].innerHTML;
	var shareUrl = DOM.getValue('shareUrl');
	
	if(!emailField.disabled) {
		var errorMsg = Util.emailNotValid(emailTo, name);

		if( !errorMsg ) {
			if( myAddressBook.emails.contains(emailTo) ) {
				errorMsg = emailTo + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(emailTo) + '\' from the list or type in a new email address.';					
			}
		}
		
		if(errorMsg) {
			alert(errorMsg);
			
			return;
		}
	}
	
	var messageText = document.getElementById('textarea_msgShare').value;
	var imageId = document.getElementById('id_msgShare').value;
		
	ajaxHandler.giveImage( action, this, imageId, emailTo, messageText, false, faceId, name, contactId, shareUrl, !emailField.disabled );
};

Alert.prototype.addNewContact = function(select, faceUrl) {
	select.selectedIndex = 0;
	
	this._alertXS('Add New Contact');
	
	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentXS( xmlHttp.responseText );

					
					try {
						document.getElementById('addressBook_newContactName').focus();
					} catch(e) {}

				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/addNewContact?selectId=' + select.id + '&faceUrl='+escape(faceUrl)), true);
	xmlHttp.send(null);	
};

Alert.prototype.uscEpilogue = function( name, email, imageId, faceNr ) {
	this.closeXL();

	var url = '/uscEpilogue'
		+ '?identifiedUserEmail=' + email
		+ '&identifiedUserName=' + name.replace(/\s/gi, '_SPACE_')
		+ '&imageId=' + imageId
		+ '&faceNumber=' + faceNr;
		
	this._alertL('Provide more training examples of ' + Util.revertSafeString(name));
	
	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentL( xmlHttp.responseText );
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);	
};

Alert.prototype.uscTraining = function( name, email, imageId, faceNr ) {
	this.closeM();
	
	var url = '/uscTraining'
		+ '?identifiedUserEmail=' + email
		+ '&identifiedUserName=' + name.replace(/\s/gi, '_SPACE_')
		+ '&imageId=' + imageId
		+ '&faceNumber=' + faceNr;

	var rexeeUrl = ajaxHandler.getRexeeDomain( url, 'html' );
		
	this._alertXL('Provide more training examples of ' + Util.revertSafeString(name));
	
	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentXL( xmlHttp.responseText );
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl(rexeeUrl), true);
	xmlHttp.send(null);	
};

Alert.prototype.uscPrologue = function( name, email, imageId, faceNr ) {
	
	
	var url = '/ajaxHandler?action=getTrainingSetCountForUser'
		+ '&identifiedUserEmail=' + email
		+ '&identifiedUserName=' + name.replace(/\s/gi, '_SPACE_');

	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					var xml = xmlHttp.responseText;
					var countStr = xmlHttp.responseText.match(/count=\"\d{0,4}\"/gi)+'';
					var count = countStr.substring(7, countStr.lastIndexOf('"'));
					
					if( count*1 < 10 ) {
						a.uscPrologue2( name, email, imageId, faceNr );
					}
				
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);		
};

Alert.prototype.uscPrologue2 = function( name, email, imageId, faceNr ) {
	
	var url = '/uscPrologue'
		+ '?identifiedUserEmail=' + email
		+ '&identifiedUserName=' + name.replace(/\s/gi, '_SPACE_')
		+ '&imageId=' + imageId
		+ '&faceNumber=' + faceNr;
		
	var rexeeUrl = ajaxHandler.getRexeeDomain( url, 'html' );

	this._alertM('Provide more training examples of ' + Util.revertSafeString(name));

	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl(rexeeUrl), true);
	xmlHttp.send(null);		
};

Alert.prototype.request = function(encryptedImageId) {
	this._alertM('Request Access to 1 Photo');
	
	var xmlHttp = DOM.getXmlHttp();
	
	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/request?encryptedImageId=' + encryptedImageId), true);
	xmlHttp.send(null);
};

Alert.prototype.shareOne = function(photoUrl, photoId, w, h) {	
	this._alertM('Share This Photo With...');
	
	var xmlHttp = DOM.getXmlHttp();
	
	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );
					
					with( document.getElementById('img_msgShare') ) {
						width = w;
						height = h;
						src = photoUrl;
					}
					
					DOM.setValue('id_msgShare', photoId);
					DOM.setValue('shareUrl', location.href);					
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/share?'), true);
	xmlHttp.send(null);
};

Alert.prototype.share = function(photo) {
	if( gSearchText ) {
		this._alertM('Share Results for ' + gSearchText + ' with...');
	} else {
		this._alertM('Share This Album With...');	
	}
	
	var xmlHttp = DOM.getXmlHttp();
	
	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );
					
					with( document.getElementById('img_msgShare') ) {
						width = photo.width;
						height = photo.height;
						src = photo.src;
					}
					
					DOM.setValue('id_msgShare', photo.id);
					DOM.setValue('shareUrl', location.href);					
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/share?'), true);
	xmlHttp.send(null);
};

Alert.prototype.shareWelcome = function(name,faceUrl,faceId,shareUrl) {	
	this._alertM('Give photos of ' + Util.revertSafeString(name) + ' to...');
	
	var xmlHttp = DOM.getXmlHttp();
	
	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );

					with( document.getElementById('img_msgShare') ) {
						width = 90;
						height = 90;
						src = faceUrl;
					}					
					DOM.setValue('id_msgShare', faceId);
					DOM.setValue('shareUrl', shareUrl);					 
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/share?'), true);
	xmlHttp.send(null);
};

Alert.prototype.shareAlbum =  function(name,url,w,h,shareLink,imageId){
	this._alertM('Share album ' + Util.revertSafeString(name) + ' With...');

	var xmlHttp = DOM.getXmlHttp();

	var a = this;
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					a._setContentM( xmlHttp.responseText );

					with( document.getElementById('img_msgShare') ) {
						width = w;
						height = h;
						src = url;
					}
					
					DOM.setValue('id_msgShare', imageId);
					DOM.setValue('shareUrl', shareLink);					
				}
			}
		}
	}	

	xmlHttp.open("GET", Util.getNoCacheUrl('/share?'), true);
	xmlHttp.send(null);
}

Alert.prototype.comingSoon = function() {
	this._alertS('Coming Soon');
}

Alert.prototype._alertS = function(title) {
	this._alert('S', title);
};

Alert.prototype._alertM = function(title) {
	this._alert('M', title);
};

Alert.prototype._alertL = function(title) {
	this._alert('L', title);
};

Alert.prototype._alertXL = function(title) {
	this._alert('XL', title);
};

Alert.prototype._alertXS = function(title) {
	this._alert('XS', title);
};

Alert.prototype._alert = function(type, title) {
	this.opened = true;
	
	if( Util.isIe6() ) {
		this._hideSelects();
	}
	
	DOM.show('popup');
	DOM.show('alert-'+type);
	
	this._setTitle( type, title );
};

Alert.prototype._hideSelects = function() {
	this.alerts = DOM.getBody().getElementsByTagName('select');
	
	for( var i=0; i < this.alerts.length; i++ ) {
		DOM.setVisible( this.alerts[i], false );
	}
};

Alert.prototype._showSelects = function() {
	if( this.alerts ) {
		for( var i=0; i < this.alerts.length; i++ ) {
			DOM.setVisible( this.alerts[i], true );
		}
	}
	
	this.alerts = '';
};

Alert.prototype._setTitle = function(type, title) {
	document.getElementById('alertTitle-'+type).innerHTML = Util.shorten(title, 60);
};

Alert.prototype.closeS = function() {
	this._close('S');
};

Alert.prototype.closeM = function() {
	this._close('M');
};

Alert.prototype.closeL = function() {
	this._close('L');
};

Alert.prototype.closeXL = function() {
	this._close('XL');
};

Alert.prototype.closeXS = function() {
	this._close('XS');
};

Alert.prototype._close = function(type) {
	DOM.hide('alert-'+type);
	DOM.hide('popup');
	
	this._setTitle( type, '' );
	this._setContent( type, '' );
	
	if( Util.isIe6() ) {
		this._showSelects();
	}
	
	this.opened = false;
};

Alert.prototype._setContentS = function(content) {
	this._setContent('S', content);
};

Alert.prototype._setContentM = function(content) {
	this._setContent('M', content);
};

Alert.prototype._setContentL = function(content) {
	this._setContent('L', content);
};

Alert.prototype._setContentXL = function(content) {
	this._setContent('XL', content);
};

Alert.prototype._setContentXS = function(content) {
	this._setContent('XS', content);
};

Alert.prototype._setContent = function(type, content) {
	document.getElementById('alertContent-'+type).innerHTML = content;
};

Alert.prototype.getContentS = function() {
	return this._getContent('S');
};

Alert.prototype.getContentM = function() {
	return this._getContent('M');
};

Alert.prototype.getContentL = function() {
	return this._getContent('L');
};

Alert.prototype.getContentXL = function() {
	return this._getContent('XL');
};

Alert.prototype.getContentXS = function() {
	return this._getContent('XS');
};

Alert.prototype._getContent = function(type) {
	return document.getElementById('alertContent-'+type);
};

Alert.prototype.assignAdd = function(selectId, overlay) {
	var name = document.getElementById('addressBook_newContactName').value;
	var email = document.getElementById('addressBook_newContactEmail').value;
	
	var errorMsg = Util.addressNotValid( name, email );
	
	var result = '';
	if( !errorMsg ) {
		result = myAddressBook.insert(name, email);
		
		if( !result.success ) {
			if( !result.nameSuccess ) {
				errorMsg = name + ' is already in your Address Book.';
			} else if( !result.emailSuccess ) {
				errorMsg = email + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(email) + '\' from the list or type in a new email address.';
			}
		}		
	}
	
	if( !errorMsg ) {
		this.hideErrorMsg();
		
		var select = document.getElementById(selectId);
		
		var i = result.index+3;
		
		var allDrops = DOM.getElementsByClassName('content', 'addressBookSelect');
		for( var j=0; j < allDrops.length; j++ ) {
			var option = allDrops[j].options[0].cloneNode(false);
			option.value = email+gDelimiter+name;
			option.innerHTML = name;
		
			if( i >= 0 ) {
				allDrops[j].insertBefore( option, allDrops[j].options[i] );
			} else {
				allDrops[j].appendChild( option );
			}
		}
		
		select.selectedIndex = i >= 0 ? i : select.options.length-1;

		try {
			if( Util.isIe6() ) {
				DOM.getBody().focus();
			} else {
				select.blur();
			}

		} catch(e) {}

		if( overlay.isOwner ) {
			ajaxHandler.addNewContact( name, email );
		}

		this.closeXS();

		return select.selectedIndex;
	} else {
		this.showErrorMsg(errorMsg);
	}
	
	return 0;
};

Alert.prototype.showErrorMsg = function( msg ) {
	DOM.show( 'addressBook_errorMsg' );
	
	document.getElementById('addressBook_errorMsg').innerHTML = msg;
};

Alert.prototype.hideErrorMsg = function() {
	DOM.hide( 'addressBook_errorMsg' );
};
function AjaxHandler() {

}

AjaxHandler.WWW_AJAX_URL = 'ajaxHandler?';
AjaxHandler.FOLDER_SEARCH_URL = 'search?btnGetImagesInFolder=btnGetImagesInFolder&pageNumber=1&folderID=';
AjaxHandler.GET_TRAINING_SET_HTML = '/trainingSet?btnGetTrainingSet=btnGetTrainingSet';
AjaxHandler.DELETE_FROM_TRAINING_SET = '/trainingSet?btnDeleteFromTrainingSet=btnDeleteFromTrainingSet';


AjaxHandler.ON = true;

AjaxHandler.prototype.getRexeeDomain = function(url, type) {
	return 'rexeeProxy?page=' + escape(url) + '&type=' + type;
};

AjaxHandler.prototype.getSimpleTrainingPage = function() {
    this.ajaxGetPage( this.getRexeeDomain('html_simpleTrainingContent.jsp', 'html'), 'simpleTrainingTable', 'active.onload();' );
};

AjaxHandler.prototype.getUscPage = function() {
    this.ajaxGetPage( this.getRexeeDomain('html_recognize_content.jsp', 'html'), 'faceClusters', 'active = new UscController()' );
};

AjaxHandler.prototype.findText = function() {
	this.findMore(gKeywordTextSearch);
};

AjaxHandler.prototype.showFolderContents = function( folderId ) {
	if( gUseProxy ) {
		location = '/album/' + folderId;
	} else {
		location = AjaxHandler.FOLDER_SEARCH_URL + folderId;	
	}
};

AjaxHandler.prototype.markAdult = function(imageId) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=markAdult'
		+ '&imageID=' + imageId;

	this.ajaxSend( url );	
};

AjaxHandler.prototype.submitMySpace = function( username, password, searchString, interest, bulletin ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=addToMySpace'
		+ '&username=' + username
		+ '&password=' + password
		+ '&searchString=' + escape(searchString)
		+ '&interest=' + interest
		+ '&bulletin=' + bulletin;

	this.ajaxSend( url );	
};

AjaxHandler.prototype.submitBlogger= function( username, password, searchString, blogId ,blogTitle,sourcePage,imageID,bloggerType) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=addToBlogger'
		+ '&username=' + username
		+ '&password=' + password
		+ '&blogId='+ blogId
		+ '&blogTitle=' + blogTitle
		+ '&sourcePage='+ sourcePage
		+ '&imageID=' + imageID
		+ '&bloggerType='+bloggerType
		+ '&searchString=' + escape(searchString);		
	this.ajaxSend( url );	
};
AjaxHandler.prototype.editContactEmail = function( name, email ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=editContactEmail'
		+ '&name='+name
		+ '&email='+email;
	
	this.ajaxSend( url );	
};

AjaxHandler.prototype.changeImageAccessLevel = function( imageId, imageAccessLevel ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=changeImageAccessLevel'
		+ '&imageAccessLevel=' + imageAccessLevel
		+ '&imageID=' + imageId;

	this.ajaxSend( url );	
}

AjaxHandler.prototype.mergeTrainingSets = function( name, acceptedList, searchedUserName ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=mergeTrainingSets'
		+ '&acceptedUserIDs=' + acceptedList
		+ '&identifiedUserName=' + name.replace(' ', '_SPACE_')
		+ '&searchedUserName=' + searchedUserName.replace(' ', '_SPACE_');

	this.ajaxSend( url );	
};

AjaxHandler.prototype.initAutoRec = function(userId, email){
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=startAutoRec'
		+ '&userID='+userId;
		+ '&userEmail='+email;
		
		this.ajaxSend( url );
		location.href="/simpleTraining";
}

AjaxHandler.prototype.recognizeSimilarFaces = function( name, email, acceptedList, rejectedList, doAutoRec ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=recognizeSimilarFacesForUser'
		+ '&identifiedUserEmail=' + email
		+ '&identifiedUserName=' + name.replace(' ', '_SPACE_')
		+ '&accepted=' + acceptedList
		+ '&rejected=' + rejectedList
		+ '&doAutoRec=' + doAutoRec;

	this.ajaxSend( this.getRexeeDomain(url, 'xml') );	
}

AjaxHandler.prototype.deleteContacts = function( contactIds ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=deleteContactsAndGroups'
		+ '&contactIds=' + contactIds;
	
	this.ajaxSend( url );
}

AjaxHandler.prototype.getTrainingSetHtml = function(contactUserID, contactEmail,id,hashedTrainingSet,fullName) {
	if( contactEmail == 'null' ){
		contactEmail = '';	
	}
	
	var url = AjaxHandler.GET_TRAINING_SET_HTML
		+ '&contactUserId='+ contactUserID
		+ '&email='+ contactEmail
		+ '&contactId='+ id
		+ '&fullName='+ fullName;
	
	this.ajaxGetTrainingSetHtml (url,id,hashedTrainingSet);
}

AjaxHandler.prototype.deleteFromTrainingSet = function(contactUserID, contactEmail,id,hashedTrainingSet,fullName, faceId) {
	if( contactEmail == 'null' ){
		contactEmail = '';
	}
	
	var url = AjaxHandler.DELETE_FROM_TRAINING_SET
		+ '&contactUserId='+ contactUserID
		+ '&contactId='+ id
		+ '&email='+ contactEmail
		+ '&fullName='+ fullName
		+ '&faceId='+ faceId;
	
	this.ajaxGetTrainingSetHtml (url,id,hashedTrainingSet);
}

AjaxHandler.prototype.findCatalog = function(searchText, catalogNr) {
	if( searchText ) {
		searchText = Util.revertSafeString(searchText);
	}
	
	location = '/search?btnCatalog='+catalogNr
					+ ( searchText ? '&searchText='+escape(searchText) : '' );
};

AjaxHandler.prototype.findPop = function(searchText) {
	if( searchText ) {
		searchText = Util.revertSafeString(searchText);
	}
	
	location = '/search?btnPopular=btnPopular'
					+ ( searchText ? '&searchText='+escape(searchText) : '' );
};

AjaxHandler.prototype.findMore = function(searchText, excludeImageId, personName, faceID, imageID, overlayID ) {
	if( searchText ) {
		searchText = Util.revertSafeString(searchText);
	}

	var getString = location.search;
	var getParams = getString.parseQuery();
	
	location = '/search?btnSearch=' + ( getParams['btnSearch'] ? getParams['btnSearch'] : gDefaultSearchBarrel )
					+ ( searchText ? '&searchText='+escape(searchText) : '' )
					+ ( faceID ? '&faceID='+escape(faceID) : '' )
					+ ( gIsLoggedIn && gAcct ? '&acct='+gAcct : '');
}


AjaxHandler.prototype.findMoreNew = function(searchText, excludeImageId, personName, faceID, imageID, overlayID, drillDown ) {
	if( searchText ) {
		searchText = Util.revertSafeString(searchText);
	}

	var getString = location.search;
	var getParams = getString.parseQuery();
	
	location = '/search?btnSearch=' + ( getParams['btnSearch'] ? getParams['btnSearch'] : gDefaultSearchBarrel )
					+ ( searchText ? '&searchText='+escape(searchText) : '' )
					+ ( faceID ? '&faceID='+escape(faceID) : '' )
					+ ( gIsLoggedIn && gAcct ? '&acct='+gAcct : '')
					+ ( drillDown ? '&drillDown='+drillDown : '' );
}

AjaxHandler.prototype.deleteMsgs = function( messageIds ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'messageIDs=' + messageIds
		+ '&action=changeMailStatus&messageStatus=D';
	
	this.ajaxSend( url );
}

AjaxHandler.prototype.assignContact = function( imageId, overlayId, contactName, contactEmail, faceNr ) {	
	
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=assignContactToOverlay'
		+ '&imageID=' + imageId
		+ '&overlayID=' + overlayId
		+ '&contactName=' + contactName
		+ '&contactEmail=' + contactEmail
		+ '&faceNumber=' + faceNr;

		
	this.ajaxSend( url );
}

AjaxHandler.prototype.addNewContact = function( name, email, imageId, faceNr ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=addContact'
		+ '&contactName=' + name
		+ '&contactEmail=' + email
		+ '&imageID=' + imageId
		+ '&faceNumber=' + faceNr;
		
	this.ajaxSend( url );
}

AjaxHandler.prototype.deletePhoto = function( imageId ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=deletePhoto'
		+ '&imageID=' + imageId;
		
	this.ajaxSend( url );	
}

AjaxHandler.prototype.downloadImage = function( imageId ) {
	location = AjaxHandler.WWW_AJAX_URL + 'action=downloadPhoto&imageID=' + imageId;
}

AjaxHandler.prototype.downloadAll = function( imageIds ) {
	location = AjaxHandler.WWW_AJAX_URL + 'action=downloadAllImages&imageIDs=' + imageIds;
}

AjaxHandler.prototype.rankImage = function( imageId, rank , searchTextNew ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=rankPhoto'
		+ '&imageID=' + imageId 
		+ '&imageRank='+rank
		+ '&searchText='+searchTextNew;
		
	this.ajaxSend( url );
}

AjaxHandler.prototype.ajaxGetRank = function(imageID, searchText){

	var url = AjaxHandler.WWW_AJAX_URL+ 'action=getRankAndTags&imageID='+imageID+'&searchText='+searchText;
	
	if ($('tagHidden_'+imageID).value == "true"){
	
	
		var xmlHttp = DOM.getXmlHttp();

	xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
					if( xmlHttp.responseText > '' ) {
						var a = xmlHttp.responseText;
						
						var tags = a.split(gDelimiter);
						var rank = tags[0]*1;
						var temp = '';

						for(ii=1; ii <= rank; ii++) {
							$('img'+ii+'_'+imageID).src =  'images/star_on.gif';
						}
						
							if(navigator.platform == "Win32" ) {
								$('tagContainer_'+imageID).blur();
							}
						
						// skip the first tag - it's the rank!
						for(ii=1; ii < tags.length && ii < 4; ii++) {
								if(tags[ii] != '')
								temp += tags[ii] + (ii < tags.length-1 && ii < 3 ? ', ' : '');
						}
						
						$('tagContainer_'+imageID).innerHTML = temp;													
					}
				} else {
					alert( xmlHttp.status + '\n\n' + xmlHttp.responseText );
				}
			}
		}

	
		xmlHttp.open("GET", url, true);
		xmlHttp.send(null);

		};
	
};

AjaxHandler.prototype.rankImageOverlay = function( overlayId, rank , imageIdNew, searchText ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=rankPhoto'
		+ '&imageID=' + imageIdNew 
		+ '&imageRank='+rank
		+ '&overlayID='+overlayId
		+ '&searchText='+searchText;

	this.ajaxSend( url );
}




AjaxHandler.prototype.giveImage = function( action, popup, imageId, emailTo, messageText, addTo, faceId, name, contactId, shareLink, isNewEmail ) {
	var url = AjaxHandler.WWW_AJAX_URL
			+ 'action=' + action
			+ '&imageID=' + imageId 
			+ '&emailAddress=' + emailTo
			+ '&messageText=' + messageText
			+ '&permissionAction=assignPermission'
			+ '&faceID=' + faceId 
			+ '&contactId=' + contactId
			+ '&name=' + name
			+ '&shareLink='+escape(shareLink);
			
	if( isNewEmail ) {
		url += '&isNewEmail=y';
	}

        var str = '';
        var xmlHttp = this._getXmlHttp();

        xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4) {
                        if (xmlHttp.status == 200) {
                                str = xmlHttp.responseText ;
                                if(str == 'false'){
                                  alert('Sorry, you couldnt share the photos, please try again later');
                                }
                                if(str == 'true'){
                                  if(isNewEmail){
                                        active.postShareSubmit(name,emailTo);
                                  }
                                alert('You have successfully shared images');
                                }

                                popup.closeM();
                        }
                }
        }

        xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
        xmlHttp.send(null);
}

AjaxHandler.prototype.getUnrecognizedCounter = function() {
	var url = AjaxHandler.WWW_AJAX_URL
			+ 'action=getFaceCounters'
			+ '&type=unrecognized';

        var xmlHttp = this._getXmlHttp();

        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    var newCounter = xmlHttp.responseText*1;
                    var oldCounter = DOM.getInnerHTML('unrecognizedNr')*1;

                    if( oldCounter != newCounter && DOM.exists('totalPhotosAnim') ) {
                        DOM.setInnerHTML( 'unrecognizedNr', newCounter );
                        DOM.setImgSrc( 'unrecognizedAnim', '/images/anim-c.gif' );
                        DOM.setImgSrc( 'totalPhotosAnim', '/images/anim-c.gif' );
                    } else {
                        DOM.setImgSrc( 'unrecognizedAnim', '/images/spacer.gif' );
                        DOM.setImgSrc( 'totalPhotosAnim', '/images/spacer.gif' );
                    }
                }
            }
        }

        xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
        xmlHttp.send(null);
}

AjaxHandler.prototype.requestImage = function( encryptedImageId, messageText ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=requestImage'
		+ '&encryptedImageId=' + encryptedImageId
		+ '&messageText=' + escape(messageText);
	
	this.ajaxSend( url );
}

AjaxHandler.prototype.addImageComment = function( imageId, comment ) {
	var url = AjaxHandler.WWW_AJAX_URL + 'action=addImageComment' + '&comment=' + comment;
	
	this.ajaxPost( url,'imageID='+imageId, 'application/x-www-urlencoded' );
}

AjaxHandler.prototype.editSpecialTags = function( imageId, scene, location, date ) {	
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=editAlbumLocationDateAndScene'
		+ '&scene=' + scene
		+ '&location=' + location
		+ '&date=' + date;
	
	this.ajaxPost( url,'imageID=' + imageId, 'application/x-www-urlencoded' );
}

AjaxHandler.prototype.editLocation = function( imageId, scene, locationNew, date, street, city, state, zipcode, country, applyAll) {	
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=editAlbumLocationDateAndScene'
		+ '&scene=' + scene
		+ '&location=' + locationNew
		+ '&date=' + date
		+ '&street=' + street
		+ '&city=' + city
		+ '&state=' + state
		+ '&zipcode=' + zipcode
		+ '&country=' + country
		+ '&applyAll=' + applyAll

	this.ajaxPost( url,'imageID=' + imageId, 'application/x-www-urlencoded' );
}



AjaxHandler.prototype.addImageTag = function( imageId, tagText ) {
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=addImageTag' 
		+ '&tag=' + tagText;
	
	this.ajaxPost( url,'imageID=' + imageId,'application/x-www-urlencoded');
}

AjaxHandler.prototype.editOverlayTag = function( imageId, overlayId, tagText ) {
	var url = AjaxHandler.WWW_AJAX_URL
			+ 'action=editOverlay'
			+ '&imageID=' + imageId
			+ '&overlayID='+overlayId +'&tag='+tagText;
		
	this.ajaxSend( url );
}

AjaxHandler.prototype.deleteOverlay = function( imageId,overlayId ) {
	var url = AjaxHandler.WWW_AJAX_URL
				+ 'action=deleteOverlay'
				+ '&overlayID='+ overlayId
				+ '&imageID='+ imageId;
		
	this.ajaxSend( url );	
}

AjaxHandler.prototype.rexeePost = function( postStr ) {
	this.ajaxPost( '/rexeeProxy?', postStr, 'application/x-www-urlencoded' );
};

AjaxHandler.prototype.ajaxPost = function( url, postStr, contentType ) {
	if( AjaxHandler.ON ) {
		
		if(!contentType){
			contentType = 'text/xml';
		}
		
		var xmlHttp = this._getXmlHttp();
		xmlHttp.open("POST", Util.getNoCacheUrl(url), false);
		xmlHttp.setRequestHeader("Content-Type", contentType);
		xmlHttp.send( postStr );	
	}
};

AjaxHandler.prototype.ajaxSend = function( url, override ) {
	var xmlHttp = '';

	if( AjaxHandler.ON || override ) {
		xmlHttp = this._getXmlHttp();
		xmlHttp.open("GET", Util.getNoCacheUrl(url), false);
		xmlHttp.send(null);
	}
	
	return xmlHttp;
}

AjaxHandler.prototype.ajaxGetPage = function( url, contentDiv, js ) {
    if( AjaxHandler.ON ) {
	var xmlHttp = this._getXmlHttp();

	xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    DOM.setInnerHTML( contentDiv, xmlHttp.responseText );

                    eval(js);
                }
            }
	}

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);
    }
}

AjaxHandler.prototype.ajaxGetTrainingSetHtml = function( url, id, hashedTrainingSet ) {
    this.ajaxGetPage( url, 'trainingSet_'+id, 'hashedTrainingSet[id]=xmlHttp.responseText' );
}

AjaxHandler.prototype._getXmlHttp = function() {
	return DOM.getXmlHttp();
}

AjaxHandler.prototype.getUserBlogs = function( username,password,bloggerType) {
	var url = AjaxHandler.WWW_AJAX_URL
			+ 'action=getUserBlogs'
			+ '&username=' + username
			+ '&password='+ password
			+ '&bloggerType='+bloggerType;
	var str = '';
    var xmlHttp = this._getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200) 
			{
				str = xmlHttp.responseXML;
//				if(str == null)
//				{
//					alert('Sorry, No Blogs found');
//				}
//				else
//				{
					active.updateUserBlogs(str);
//				}
			
			}
		}
	}
        xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
        xmlHttp.send(null);
}

var ajaxHandler = new AjaxHandler();
function giveMeKey(){
	var validNameFlag = false;
	var validCheckFlag = false;
	if($('appName').value == ''){
		alert("Please enter a valid application name")
		$('appName').focus();
		validNameFlag = false;
		return false;
	}else{
		validNameFlag = true;
	}
	if($('agreement').checked){
		validCheckFlag = true;
	}else{
		alert("To get a Riya application key, you must agree to the Riya API agreement by checking the checkbox");
		validCheckFlag = false;
		return false;
	}
	if(validCheckFlag && validNameFlag){
		document.apiForm.submit();
	}else{
		return false;
	}
}
function Poll(interval) {
	this.interval = interval;
	this.id = 0;
}

Poll.prototype.start = function() {
	var poll = this;
	
	this.id = setInterval( function() { poll.ping() }, this.interval );
};

Poll.prototype.ping = function() {
	this.process();
};

Poll.prototype.process = function(param) {
	if( this.isDone(param) ) {
		this.stop();
		
		this.onDone(param);
	} else {
		this.notDone(param);
	}
};

Poll.prototype.stop = function() {
	clearInterval( this.id );
};

Poll.prototype.isDone = function() {
	return false;
};

Poll.prototype.onDone = function() {};

Poll.prototype.notDone = function() {};
function CyclePoll(interval, maxCycles) {
	Poll.call(this, interval);
	
	this.maxCycles = maxCycles;
	this.cycles = 0;
}

CyclePoll.prototype = new Poll;

CyclePoll.prototype.isDone = function() {
	return (this.cycles++) >= this.maxCycles;
};
/*********************************************************
	
			AUTO SUGGEST - AUTO FILL FEATURE

***********************************************************/

function AutoSuggest(inputBox, arrayName)
{

	var arrayHandler = new Array();

	for(i=0;i<arrayName.length();i++){
		arrayHandler[i] = arrayName.getByIndex(i);
	}

	var arrayHandlerLen = arrayHandler.length;
	
	var dontKnow = 'Don\'t Know';
    var notAFace = 'not a face';
			
	
	arrayHandler[arrayHandlerLen] = 'Don\'t Know';
	arrayHandler[arrayHandlerLen+1] = 'Not A Face';

	 /*
      * Base object to access AutoSuggest from the inputhandler.
	  */
	var eventHandler = this;
	/*
	 * Get the input field name	
	 */
	 var inputHandler = document.getElementById(inputBox);
	 /*
      * Autosuggest Handler for the list to display.
	  */
	this.inputHandler = inputHandler;
	 /*
      * Array holder.
	  */
	this.arrayHandler = arrayHandler;
	 /*
      * sub array for values that match the input.
	  */
	this.matchingArray = new Array();  
	 /*
      * Input text handler
	  */
	this.inputBox = null;
	 /*
      * Div for accessing AutoSuggest from InputHandler
	  */
	this.div = document.getElementById("namePicker");

	 /*
      * keycode values. Assigned functions Tab key = Select the highlighted, ENTER key = Select the highlighted ESC Key = escape/disable the suggest UP/DOWN = Move the list.
	  */
	var BACKSPACE = 8;
	var TAB = 9;
	var ENTER = 13;
	var ESC = 27;
	var UPARROW = 38;
	var DOWNARROW = 40;
	
	/*********************************************************
	
					SETTINGS SECTION

	**********************************************************/
	 
	 /*
      * 0 to highlight the first value in the list. -1 for disbable the option
	  */
	this.selectDefault = 0;
	 /*
      * Disable browser autocomplete option for the selected input box.
	  */

	  if(!inputHandler){return;}
	  inputHandler.setAttribute("autocomplete","off");


	//We need to be able to reference the inputHandler by id. If it doesn't have an id, set one.
	var idCounter = 0;
	if(!inputHandler.id)
	{
		var id = "namePicker" + idCounter;
		idCounter++;

		inputHandler.id = id;
	}
	  

	 /*
      * on keyDown check for the keyvalue and call the required function
	  * Assigned functions Tab key = Select the highlighted, ENTER key = Select the highlighted ESC Key = escape/disable the list.
	  * UP/DOWN = Move the list.
	  */
	inputHandler.onkeydown = function(keyValue)
	{
		var key = eventHandler.getKeyCode(keyValue);
		switch(key)
		{
			case ENTER:
			eventHandler.useMatch();
			break;

			case TAB:
			active.tempNameValue = document.getElementById(inputBox).value;
			eventHandler.hideDiv();
			break;

			case ESC:
			if(!Util.isIe6()) {
				active.tempNameValue = ''
				document.getElementById(inputBox).value = '';
				eventHandler.hideDiv();
			}else{
				active.tempNameValue = ''
				eventHandler.hideDiv();
			}
			break;

			case UPARROW:
			if (eventHandler.selectDefault > 0)
			{
				eventHandler.selectDefault--;
			}
			eventHandler.changeHighlight(key);
			break;

			case DOWNARROW:
			if (eventHandler.selectDefault < (eventHandler.matchingArray.length - 1))
			{
				eventHandler.selectDefault++;
			}
			eventHandler.changeHighlight(key);
			break;
		}
	};

	 /*
      * onkeyup, display the list of matching values for the input text.
	  */
	inputHandler.onkeyup = function(keyValue) 
	{
		var key = eventHandler.getKeyCode(keyValue);

		switch(key)
		{
		case ENTER:
			eventHandler.getEmail(inputBox, arrayHandler);
		case TAB:
			active.tempNameValue = document.getElementById(inputBox).value;
			eventHandler.hideDiv();
			break;

		case ESC:
			if(!Util.isIe6() ) {				
				active.tempNameValue = '';
				document.getElementById(inputBox).value = '';
				eventHandler.hideDiv();
			}else{
				active.tempNameValue = '';
				eventHandler.hideDiv();
			}
			break;
		case UPARROW:
		case DOWNARROW:
			return;		
		default:
			
			if (this.value.length > 0 )
			{
				eventHandler.inputBox = this.value;
				/*
				 * call the functions to generate the match, li list, placing the list and display list..
				 */
				eventHandler.getMatching();
				eventHandler.generateDiv();
				eventHandler.placeDiv();
				eventHandler.displayDiv();
			}
			else
			{
				eventHandler.hideDiv();
			}
			eventHandler.nonMatching();
		}
	};

	 this.nonMatching = function()
	 {
		if(this.matchingArray.length == '0')
		{
			
			var emailTextbox = inputBox.split('__')[0]+'__email';
			document.getElementById(emailTextbox).value = '';
			active.tempNameValue = document.getElementById(inputBox).value;			
		}else{
			return;				
		}		
	 }

	 /*
      * insert the selected suggestion to the input box. Hide the list options.
	  */
	this.useMatch = function()
	{
		if (this.selectDefault > -1)
		{
			var tempValue = this.inputHandler.value;
			/*
			 * Fix for enter key Bug to remove undefined value if the values are not matching with array
			 */
			if(this.inputHandler.value = this.matchingArray[this.selectDefault]){
				this.inputHandler.value = this.matchingArray[this.selectDefault]
			}else{
				this.inputHandler.value = tempValue;
			};
			this.hideDiv();

			
		}		
	};

	 /*
      * enable/display the list options
	  */
	this.displayDiv = function()
	{
		this.div.style.display = 'block';
		//setTimeout("universalHideDiv()", 5000);
		
	};

	 /*
      * escape sequence - hide the list option.
	  */
	this.hideDiv = function()
	{
		this.div.style.display = 'none';
		this.selectDefault = 0;
	};

	 /*
      * change the style to higlight current the selection in the list when you pick one.
	  */
	this.changeHighlight = function()
	{
		var listArray = this.div.getElementsByTagName('LI');
		for (i=0; i<listArray.length; i++)
		{
			var li = listArray[i];

			if (this.selectDefault == i)
			{
				li.className = "suggestMatching";
				active.tempNameValue = this.matchingArray[i];
			}
			else
			{
				li.className = "";
			}
		}
	};

	 /*
      * align/place the list options below the input box.
	  */
	this.placeDiv = function()
	{
		var element = this.inputHandler;
		var x = 0;
		var y = element.offsetHeight;
	
		while (element.offsetParent && element.tagName.toUpperCase() != 'BODY')
		{
			x += element.offsetLeft;
			y += element.offsetTop;
			element = element.offsetParent;
		}

		x += element.offsetLeft;
		y += element.offsetTop;

		this.div.style.left = x + 'px';
		this.div.style.top = y + 'px';
	};

	 /*
      * generate the UL and LI elements to display the list options.
	  */
	this.generateDiv = function()
	{
	
			var ul = document.createElement('ul');
			ul.id = "autoSuggestUL";
			/*
			 * If matching array length is 0 then remove the style of the list.
			 */
			if(this.matchingArray.length > '0')
			{
				ul.className = "suggest";				
			}else{
				ul.className = "";
			}			
			/*
			 * create LI for the matching words
			 */
			for (i=0; i < this.matchingArray.length; i++)
				{
				var names = this.matchingArray[i];
		
				var li = document.createElement('li');
				li.id = "autoSuggestLI";
				li.innerHTML = names;
							
				if (eventHandler.selectDefault == i)
				{
					
					li.className = "suggestMatching";
				}
				
		
				ul.appendChild(li);
			
			
		}
			
		this.div.replaceChild(ul,this.div.childNodes[0]);
	
		/*
         * on mouseover move among the choices  in the list and highlight the selected element.
	     */
		ul.onmouseover = function(keyValue)
		{
			
			var target = eventHandler.getEventSource(keyValue);
			while (target.parentNode && target.tagName.toUpperCase() != 'LI')
			{
				target = target.parentNode;
			}
		
			var listArray = eventHandler.div.getElementsByTagName('LI');
			
	
			for (i=0; i<listArray.length; i++)
			{
				var li = listArray[i];
				if(li == target)
				{
					eventHandler.selectDefault = i;
					break;
				}
			}
			eventHandler.changeHighlight();
		};

		/*
         * on mouseclick insert the selected value into the input box.
	     */
		ul.onclick = function(keyValue)
		{
			eventHandler.useMatch();
			eventHandler.hideDiv();
			eventHandler.getEmail(inputBox, arrayHandler);
			eventHandler.cancelEvent(keyValue);
			return false;
		};
		
		this.div.className="suggestDiv";
		this.div.style.position = 'absolute';	
	
	};

	/*
     * verify the array for matching options with the input Array.
	 */
	this.getMatching = function()
	{
		this.matchingArray = new Array();
		
		/*
		 * verify the array for don't know and not a face.
		 */
		//eventHandler.getNonFaceObjects();
		
		for (i=0; i<arrayHandler.length; i++) 
		{
			
			var optionValues = this.arrayHandler[i];
			if(optionValues.toLowerCase().indexOf(this.inputBox.toLowerCase()) == "0")
			{
				this.matchingArray[this.matchingArray.length]=optionValues;
				
			
			}			
			
		}
		eventHandler.matchedArrayLength = this.matchingArray.length
	};

	/*
	 * check for Don't Know and Not A Face.
	 */
	this.getNonFaceObjects = function()
	{
		var dontKnowFlag = false;
		var notAFaceFlag = false;
		var arraySize = arrayHandler.length();
		for (i=0; i<arraySize; i++) 
		{
			if(arrayHandler[i] == "Don\'t Know")
			{
				dontKnowFlag = true;
			}
			if(arrayHandler[i] == "Not A Face")
			{
				notAFaceFlag = true;
			}			
		}
		if(!dontKnowFlag)
		{
			this.arrayHandler[arraySize] = "Don\'t Know";
			
		}
		if(!notAFaceFlag)
		{
			this.arrayHandler[arraySize+1] = "Not A Face";
		}
	}

	/*
	 * get the curresponding email and place it.
	 */
	this.getEmail = function(inputBox,arrayNames)
	{
		var nameValue =  document.getElementById(inputBox).value;
		var faceId = inputBox.split('__')[0];
		var otherTextbox = inputBox.split('__')[0]+'__email';
		var emailValue='';
		dontKnowFlag = true;
		
		if(document.getElementById(faceId+'__email').readOnly){
			document.getElementById(faceId+'__email').readOnly = '';
		}		

		if(nameValue == "Don't Know"){
			document.getElementById(faceId+'__email').readOnly = "false";
			document.getElementById(otherTextbox).value = "dontknow@riya.com";
			dontKnowFlag = false;
		}
		if(nameValue == "Not A Face"){
			document.getElementById(faceId+'__email').readOnly = "false";
			document.getElementById(otherTextbox).value = "notaface@riya.com";
			dontKnowFlag = false;
		}

		
		if(dontKnowFlag){
			for(i=0;i<arrayNames.length;i++){
				if (nameValue == arrayNames[i]){
					emailValue = myAddressBook.names.getHashByIndex(i);
					if( emailValue.substring(0,1) == '@' ) {
						emailValue = '';	
					}
				}				
			}
			document.getElementById(otherTextbox).value = emailValue;
			if (emailValue != '')
			{
				document.getElementById(faceId+'__email').readOnly = "false";
			}
		}
	}
		
	/*********************************************************
	
					BROWSER SPECIFIC SECTION

	* for getting the keycode from IE and Mozilla
	* Get / Cancel the event source element based on IE or Mozilla
	* 

	**********************************************************/
	
	
	this.getKeyCode = function(keyValue)
	{
		/*
		 * Mozilla
		 */
		if(keyValue)			
		{
			return keyValue.keyCode;
		}
		/*
		 * IE
		 */
		if(window.event)	
		{
			return window.event.keyCode;
		}
	};

	
	this.getEventSource = function(keyValue)
	{
		/*
		 * Mozilla
		 */
		if(keyValue)			
		{
			return keyValue.target;
		}
	
		/*
		 * IE
		 */
		if(window.event)	
		{
			return window.event.srcElement;
		}
	};

	this.cancelEvent = function(keyValue)
	{
		/*
		 * Mozilla
		 */
		if(keyValue)			
		{
			keyValue.preventDefault();
			keyValue.stopPropagation();
		}
		/*
		 * IE
		 */
		if(window.event)	
		{
			window.event.returnValue = false;
		}
	}
}

   function universalHideDiv(textBox){
	
	document.getElementById("namePicker").style.display = 'none';
		
   
   }
	/*********************************************************
	
				Input collection handler

	* handle the collection of inputs. 
	
	**********************************************************/

function multipleInputsHandler(){
	/*
	 * namhandler - collection of inputs
	 */
	var nameHandler = document.getElementsByName("newName");
	for (i=0; i<nameHandler.length; i++)
	{
		var fieldName = nameHandler[i];
		new AutoSuggest(fieldName,faceName);
		}
	}
function OrderedList() {
	this.array = new Array();
	this.hash = new Object();
	
	this.OUT_OF_BOUNDS_INDEX = -9999;
}

OrderedList.prototype.matches = function(token, hashValue) {
	return this.normalize(hashValue) == this.getByHash(token);
};

OrderedList.prototype.startsWith = function(i, text) {
	return this.normalize(this.getByIndex(i)).indexOf(text) == 0;
};

OrderedList.prototype.getHashByIndex = function(i) {
	return this.getByHash(this.getByIndex(i));
}

OrderedList.prototype.getByIndex = function(i) {
	return this.array[i];
}

OrderedList.prototype.getByHash = function(token) {
	var hashValue = this.hash[ this.normalize(token) ];
	
	if( hashValue == null || hashValue == '' || hashValue == undefined ) {
		return '';
	}
	
	return hashValue;
};

OrderedList.prototype.contains = function(token) {
	return this.getByHash(token);
};

OrderedList.prototype.remove = function(token) {
	var idx = this.getInsertIndex(token);
	
	if( idx > this.OUT_OF_BOUNDS_INDEX ) {
		this.array.splice(this.getInsertIndex(token),1);	

		this.hash[ this.normalize(token) ] = '';
	}
};

OrderedList.prototype.updateHash = function(token, hashValue) {
	if( !token || !hashValue ) {
		alert('cannot insert w/o a token and a hashValue');
	}
	
	if( !this.contains(token) ) {
		alert('does not contain the token');
	}
	
	this.hash[ this.normalize(token) ] = hashValue;	
};

OrderedList.prototype.insert = function(token, hashValue) {
	if( !token || !hashValue ) {
		alert('cannot insert w/o a token and a hashValue');
		
		return new InsertResult(false, 0);
	}
	
	if( this.contains(token)) {
		return new InsertResult(false, 0);
	}

	this.hash[ this.normalize(token) ] = hashValue;

	var i = this.getInsertIndex(token);
	
	if( i == this.OUT_OF_BOUNDS_INDEX ) {
		this.array[this.array.length] = token;
	} else if( i == 0 ) {
		this.array.splice( 0, 0, token );
	} else {
		this.array.splice( i-1, 1, this.array[i-1], token );	
	}
	
	return new InsertResult(true, i);
};

OrderedList.prototype.getInsertIndex = function(token) {
	if( this.array.length <= 0 ) {
		return this.OUT_OF_BOUNDS_INDEX;		
	}
	
	var i = 0;
	var normalToken = this.normalize(token);
	
	while( this.normalize(this.array[i]) < normalToken ) {
		i++;
		
		if( i >= this.array.length ) {
			return this.OUT_OF_BOUNDS_INDEX;
		}
	}
	
	return i;
};

OrderedList.prototype.normalize = function(token) {
	return Util.trim( token ).toLowerCase();
};

OrderedList.prototype.length = function() {
	return this.array.length;
};


function InsertResult(success, index) {
	this.success = success;
	this.index = index;
}
function AddressBook() {
	this.names = new OrderedList();
	this.emails = new OrderedList();
	this.editContact = new OrderedList();
}

AddressBook.prototype.remove = function(name) {
	var email = this.names.getByHash(name);
	
	this.emails.remove(email);
	this.names.remove(name);
};

AddressBook.prototype.insert = function(name, email) {		
	if( !email ) {
		email = '@'+name;
	}
	
	if( this.names.contains(name) ) {
		return new AddressBookInsertResult(false, true, 0);
	}

	if( this.emails.contains(email) ) {
		return new AddressBookInsertResult(true, false, 0);
	}
	
	var namesResult = this.names.insert(name, email);
	var emailsResult = this.emails.insert(email, name);
	
	return new AddressBookInsertResult(namesResult.success, emailsResult.success, namesResult.index);
};

function AddressBookInsertResult(nameSuccess, emailSuccess, index) {
	this.index = index;
	this.nameSuccess = nameSuccess;
	this.emailSuccess = emailSuccess;
	
	this.success = nameSuccess && emailSuccess;
}
function Calendar() {

}

Calendar.prototype = new Active;

Calendar.prototype.displayCalendar = function(date,calendarName) {
	
	var year = date.getYear();
	if(year < 2000)
		year = year + 1900;
	if(year%4==0 && ((!(year %100 ==0)) || year % 400 == 0)) 
		lastDays[1] = 29;
        else
           lastDays[1] = 28;
	date.setDate(1);
	var firstDayIndex = date.getDay();
	
	var month = date.getMonth();
	var dateHeader = document.getElementById("dateHeader_" + calendarName);
	dateHeader.innerHTML = monthNames[date.getMonth()] + ' ' + year;
	var daysDiv = document.getElementById("days_" + calendarName);
	var daysHtml = '';
	j = 1;
	for(var k=0; k < 7 ;k++)
	{
		daysHtml += '<div class="weekDaysRow">';
		for(var i=0;i< 7;i++)
		{
			if((k == 0 && i >= firstDayIndex))
			{
				daysHtml += '<div onclick="calendar.selectDate(' + j + ',' + '\'' + calendarName + '\')" class="dayCell" id="day_' + calendarName + '_' + j + '">';
				daysHtml += '<div class="dayText" >';
				daysHtml += j++;
				daysHtml += '</div>';
			}
			else if(k > 0)
			{
				
				if(lastDays[month]  >= j)
				{
					daysHtml += '<div onclick="calendar.selectDate(' + j + ',' + '\'' + calendarName + '\')" class="dayCell" id="day_' + calendarName + '_'  + j + '">';
					daysHtml += '<div class="dayText" >';
					daysHtml += j++;
					daysHtml += '</div>';
				}
			}
			else
			{
				daysHtml += '<div onclick="selectDate(' + j + ',' + '\'' + calendarName + '\')" class="dayCell" >';
			}
			daysHtml += '</div>';
		}
	daysHtml +='</div>';
	}
	daysDiv.innerHTML = daysHtml;
}

Calendar.prototype.selectDate = function (day,calendarName)
{
	var selectedDate = document.getElementById('selectedDate_' + calendarName).value;
	var oldSelectedDiv = document.getElementById('day_' + calendarName + '_' + selectedDate);
	if(oldSelectedDiv)
	  oldSelectedDiv.className = "dayCell";
	var dayDiv = document.getElementById('day_' + calendarName + '_'  + day);
	if(dayDiv)
	  dayDiv.className = "selectedDay";
	document.getElementById('selectedDate_' + calendarName).value = day;
}


Calendar.prototype.incrementYear = function (calendarName)
{
	var date = dates[calendarName];
	var year = date.getYear();
	if(year < 1900)
		date.setYear(year + 1900 + 1);
	else	
		date.setYear(year + 1);
calendar.displayCalendar(date,calendarName);
dates[calendarName] = date;
var prevSelectedDate = document.getElementById('selectedDate_' + calendarName);
if(prevSelectedDate && prevSelectedDate.value )
	calendar.selectDate(prevSelectedDate.value,calendarName);
}

Calendar.prototype.decrementYear = function (calendarName)
{
	var date = dates[calendarName];
	var year = date.getYear();
	if(year < 1900)
		date.setYear(year + 1900 - 1);
	else	
		date.setYear(year - 1 );
	dates[calendarName] = date;
	calendar.displayCalendar(date,calendarName);
	var prevSelectedDate = document.getElementById('selectedDate_' + calendarName);
	if(prevSelectedDate && prevSelectedDate.value)
		calendar.selectDate(prevSelectedDate.value,calendarName);
	}

Calendar.prototype.decrementMonth = function (calendarName)
{
	var date = dates[calendarName];
	var month = date.getMonth();
	if(month < 0)
	{
		var year = date.getYear();
		if(year < 1900)
			date.setYear(year + 1900 -1);
		else
			date.setYear( year - 1);
		date.setMonth( 11);
			
	}
	else	
		date.setMonth(--month);
	dates[calendarName] = date;
	calendar.displayCalendar(date,calendarName);
	var prevSelectedDate = document.getElementById('selectedDate_' + calendarName);
	if(prevSelectedDate && prevSelectedDate.value)
		calendar.selectDate(prevSelectedDate.value,calendarName);
}

Calendar.prototype.incrementMonth = function (calendarName)
{
	var date = dates[calendarName];
	var month = date.getMonth();
	if(month > 10)
	{
		var year = date.getYear();
		if(year < 1900)
			date.setYear(year + 1900 + 1);
		else
			date.setYear(year + 1);
		date.setMonth (0);
		
		
	}
	else	
		date.setMonth(++month);
	
	dates[calendarName] = date;
	calendar.displayCalendar(date,calendarName);
	var prevSelectedDate = document.getElementById('selectedDate_' + calendarName);
	if(prevSelectedDate && prevSelectedDate.value)
		calendar.selectDate(prevSelectedDate.value,calendarName);
}

Calendar.prototype.onload = function() {

};
function Active() {
	this.alert = new Alert();
	
	this.refreshInterval = 0;
}

Active.prototype.nop = function() {

};

Active.prototype.btnCloseXS = function() {
	this.alert.closeXS();
};

Active.prototype.btnCloseS = function() {
	this.alert.closeS();
};

Active.prototype.btnCloseM = function() {
	this.alert.closeM();
};

Active.prototype.btnCloseL = function() {
	this.alert.closeL();
};

Active.prototype.btnCloseXL = function() {
	this.alert.closeXL();
};

Active.prototype.btnComingSoon = function() {
	this.alert.comingSoon();
};

Active.prototype.btnCheckEnter = function(e, selectId) {
	var code = new Event(e).getKeyCode();

	if (code==13) {
		this.btnAssignAdd(selectId);

		return false;
	} else{
		return true;
	}	
};
function ActiveShare() {
	this.shareAction = 'giveImages';
}

ActiveShare.prototype = new Active;

ActiveShare.prototype.btnShareSubmit = function() {
	this.alert.shareSubmit(this.shareAction);
};

ActiveShare.prototype.postShareSubmit = function() {
	// blank - implemented by PeopleHandler
};

ActiveShare.prototype.tagRedirectLogin = function(msg) {
	if( confirm(msg) ) {
		location = '/login';
	}
};
function ActiveManualTraining() {
	this.clickedToExit = false;
}

ActiveManualTraining.prototype = new Active;

ActiveManualTraining.prototype.onunload = function() {
/*
	if( !this.clickedToExit ) {
		if( confirm("All of your selections will be discarded. Do you want to save your work?") ) {
			
			var postStr = '';
			
			var selects = DOM.getElementsByTagName('content','select');
			for( var i=0; i < selects.length; i++ ) {
				postStr += '&'+selects[i].name+'='+escape(selects[i].value);
			}
			
			var inputs = DOM.getElementsByTagName('content','input');
			for( var i=0; i < inputs.length; i++ ) {
				postStr += '&'+inputs[i].name+'='+escape(inputs[i].value);
			}
			
			ajaxHandler.rexeePost( postStr );
		}
	}
 */
};

ActiveManualTraining.prototype.setClickedToExit = function(bool) {
	this.clickedToExit = bool;
};

ActiveManualTraining.prototype.btnFormSubmit = function() {
	this.setClickedToExit(true);
	this._formSubmit();
};

ActiveManualTraining.prototype._formSubmit = function() {
		
		if(active.startAutoRecoFlag){
			document.forms['trainingForm'].submit();
		}else{
			var errorMsgNew = '';
			var errorFlagName = true;
			var errorFlagEmail = true;
			name = active.nameValidator;
			email = active.emailValidator;
			if(name == ''){
				errorFlagName = true;
			}else{
				if( !Util.isNameValid(name) ){
					errorMsgNew = 'Name can contain only alphanumeric characters, periods, hyphens and apostrophes.';
					errorFlagName = false;
					return errorMsgNew;
				}
			}
			if(email == ''){
				errorFlagEmail = true;
			}else{
				if( !Util.isEmailFormatValid(email) ){
				errorFlagEmail = false;
				}
			}	
			
			
			if((errorFlagName) && (errorFlagEmail)){
				document.forms['trainingForm'].submit();			
			}
		}
	
};
function SearchPage() {
	this.pageNumber = 1;

	this.photos = '';
        this.previews = '';

	this.locked = false;
	this.done = false;
	
	this.selected = '';
}

SearchPage.prototype = new ActiveShare;

SearchPage.prototype.onload = function() {
    this.photos = DOM.getElementsByClassName( 'thumbnailContainer', 'thumbnailImg' );

    DOM.addEventListener( DOM.getBody(), "mouseover", function(e) {
	    if( window.previewTimeout ) {
		clearTimeout(window.previewTimeout);
	    }

	    var event = new Event(e);

	    var searchPreview = '';
	    try {
		searchPreview = DOM.getAncestorOfClass( event.getTarget(), 'searchPreview' );
	    } catch(e) {
		// TODO: Sajan please fix this - should never use exception handling in control flow
	    }
	    
	    if( !searchPreview ) {
		if( !this.previews ) {
		    this.previews = DOM.getElementsByClassName( 'thumbnailContainer', 'searchPreview' );
		}
		
		for( var ii=0; ii < this.previews.length; ii++ ) {
		    if( this.previews[ii] != searchPreview ) {
			DOM.hide( this.previews[ii] );
		    }
		}
		
		if( DOM.equalsIgnoreCase('thumbnailImg',event.getTarget().className) ) {
		    var id = event.getTarget().id ? event.getTarget().id : '';
		    var className = event.getTarget().className ? event.getTarget().className : '';
		    
		    window.previewTimeout = setTimeout( function() { active.preview(id, className); }, 750 );
		}
	    }
	}
    ); 
};

SearchPage.prototype.preview = function(id, className) {
    if( DOM.equalsIgnoreCase('thumbnailImg',className) ) {
	DOM.setImgSrc( 'searchPreviewImg'+id, DOM.getValue('searchPreviewURL'+id) )
	DOM.show( 'searchPreview'+id );

	var rankCount = ajaxHandler.ajaxGetRank(id, gSearchText);						
    }
};

SearchPage.prototype.ajax = function() {
	if( !this.isLocked() ) {
		this.lock();

		this.pageNumber++;

		var xmlHttp = DOM.getXmlHttp();

		var s = this;
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
					if( xmlHttp.responseText > '' ) {
						document.getElementById('moreResults_'+s.pageNumber).innerHTML = xmlHttp.responseText;

						s.expand();

						s.unlock();
					}
				} else {
					alert( xmlHttp.status + '\n\n' + xmlHttp.responseText );
				}
			}
		}

		xmlHttp.open("GET", Util.getNoCacheUrl(this.getSearchPageUrl()), true);
		xmlHttp.send(null);
	}
};

SearchPage.prototype.replacePageNumber = function(url, pageNumber) {
	if( url.match(/pageNumber=\d{0,3}/gi) ) {
		url = url.replace( /pageNumber=\d{0,3}/gi, 'pageNumber='+pageNumber );
	} else {
		url += '&pageNumber='+pageNumber;
	}
	
	return url;
};

SearchPage.prototype.getSearchPageUrl = function() {
	var params = location.search;
	
	return '/searchPage'+this.replacePageNumber(params, this.pageNumber);
};

SearchPage.prototype.refreshPhotos = function() {
	var div = document.getElementById('moreResults_'+this.pageNumber);
	
	if( div ) {
		this.photos = this.photos.concat(DOM.getElementsByClassName( div, 'thumbnailImg' ));
	}
};

SearchPage.prototype.isLocked = function() {
	return this.locked || this.done;
};

SearchPage.prototype.lock = function() {
	this.locked = true;
};

SearchPage.prototype.unlock = function() {
	this.locked = false;
};

SearchPage.prototype.max = function(imageId, websiteId, idx) {
	if( ctrlDown ) {
		if( this.selected.indexOf(imageId) >= 0 ) {
			this.unHighlight(imageId);
		
			this.selected = this.selected.replace(imageId+',', '');
		} else {
			this.highlight(imageId);
		
			this.selected += imageId + ',';
		}
	} else if( shiftDown ) {
		this.unHighlightSelected();

		
		for( var i=0; i < idx; i++ ) {
			this.highlight(this.photos[i].id);
			
			this.selected += this.photos[i].id + ',';
		}
	
	} else {
            var searchLocation = location.href;
	
            var searchURL = '/photo?id='+imageId+'&pageNumber='+idx;

            if( searchLocation.match(/\/search\//gi) ) {
                searchURL += '&btnSearch=btnSearch';

                if( searchLocation.match(/\/face\//gi) ) {
                    searchURL += '&faceID='+(searchLocation.match(/\/face\/.*\/?/gi)+'').replace(/\/face\//gi,'').replace(/\//gi, '');

                } else {
                    searchLocation = searchLocation.replace(/\/page\d{0,3}/gi,'');

                    searchURL += '&searchText='+ searchLocation.substr(searchLocation.lastIndexOf('/')+1);                    
                }

                location = searchURL + '&websiteID='+websiteId;
            } else if( searchLocation.match(/\/album\//gi) ) {
                searchURL += '&btnGetImagesInFolder=btnGetImagesInFolder';

                searchURL += '&folderID='+(searchLocation.match(/\/album\/.*\/?/gi)+'').replace(/\/album\//gi,'').replace(/\//gi, '');

                location = searchURL + '&websiteID='+websiteId;
            } else if( searchLocation.match(/\/catalog\//gi) ) {
                searchURL += '&btnCatalog=btnCatalog';

                searchURL += '&searchText='+(searchLocation.match(/\/catalog\/\d{0,3}\/.*\/?/gi)+'').replace(/\/catalog\/\d{0,3}\//gi,'').replace(/\//gi, '');

                location = searchURL + '&websiteID='+websiteId;
            } else if( searchLocation.match(/\/popular\//gi) ) {
                searchURL += '&btnPopular=btnPopular';

                searchURL += '&folderID='+(searchLocation.match(/\/popular\/.*\/?/gi)+'').replace(/\/popular\//gi,'').replace(/\//gi, '');

                location = searchURL + '&websiteID='+websiteId;
            } else {
                location = this.replacePageNumber( '/photo'+location.search+'&id='+imageId, idx ) + '&websiteID='+websiteId;
            }	
	}
};

SearchPage.prototype.highlight = function(imageId) {
	DOM.show('thumb_'+imageId);
};

SearchPage.prototype.unHighlight = function(imageId) {
	DOM.hide('thumb_'+imageId);
};

SearchPage.prototype.unHighlightSelected = function() {
	var selected = this.selected.split(',');
	
	for( var i=0; i < selected.length; i++ ) {
		this.unHighlight( selected[i] );
	}
	
	this.selected = '';
};

SearchPage.prototype.expand = function() {
	this.refreshPhotos();
};

SearchPage.prototype.getAllPhotoImageIds = function(endIdx) {
	var imageIds = '';
	
	if( !endIdx ) {
		endIdx = this.photos.length
	}
	
	for( var i=0; i < endIdx; i++ ) {
		imageIds += this.photos[i].id + ',';
	}
	
	return ( imageIds ? imageIds.substr(0, imageIds.length-1) : '' );
};

SearchPage.prototype.getSelectedPhotoImageIds = function() {
	return ( this.selected ? this.selected.substr(0, this.selected.length-1) : '' );
};

SearchPage.prototype.btnShareAll = function() {
	if( gIsLoggedIn ) {
		var imageIds = this.getAllPhotoImageIds();

		if( imageIds ) {
			this.alert.share(this.photos[0]);
		} else {
			alert('You do not have permission to share any of these photos.');
		}
	} else {
		this.tagRedirectLogin('You must be logged-in to share these photo.  Click OK to login.');
	}
};

SearchPage.prototype.btnRequestAccess = function(encryptedImageId) {
	if( gIsLoggedIn ) {
		this.alert.request( encryptedImageId );
	} else {
		this.tagRedirectLogin('You must be logged-in to request access.  Click OK to login.');	
	}
};

SearchPage.prototype.btnMySpace = function() {
	this.alert._alertL("Add this search to MySpace");
	this.alert._setContentL(
	'<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">'
  + '   <tr>'
  + '     <td width="300"><table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr>'
  + '         <td colspan="2" class="maintext"><strong>Sign in to MySpace to add photos</strong></td>'
  + '        </tr>'
  + '       <tr >'
  + '         <td width="38%" class="maintext">MySpace Email:</td>'
  + '         <td width="62%"><input id="msemail" name="msemail" type="text"/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">MySpace Password:</td>'
  + '         <td><input id="mspassword" name="mspassword" type="password"/></td>'
  + '       </tr>'
  + '		<tr>'
  + '         <td class="maintext">Section:</td>'
  + '         <td><select id="msinterest" name="msinterest">'
  + '           <option value="AboutMe">About Me</option>'
  + '           <option value="LikeToMeet">Like To Meet</option>'
  + '           <option value="General">Interests</option>'
  + '           <option value="Music">Music</option> '
  + '           <option value="Movies">Movies</option>'
  + '           <option value="Television">Television</option>'
  + '			<option value="Heroes">Heroes</option>'
  + '			<option value="Books">Books</option>'
  + '         </select></td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td>&nbsp;</td>'
  + '         <td><input type="checkbox" id="msbulletin" name="msbulletin"/>'
  + 'Post to the bulletin</td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td>&nbsp;</td>'
  + '         <td><a href="javascript:active.btnSubmitMySpace()"><img src="images/button-add.gif" border="0" ></a> <a href=javascript:active.btnCloseL()><img src="images/button-cancel.gif" border="0" ></a></td>'
  + '       </tr>'
  + '     </table></td>'
  + '     <td width="400" valign="top"><span class="maintext"><br/>'
  + '  <b> Or  </b> cut &amp; paste into MySpace</span><br>'
  + '  <textarea cols="40" rows="9">'+gEmbed
  + '</textarea></td>'
  + '   </tr>'
  + '</table>');
};

SearchPage.prototype.btnBlogger = function() {
	var bloggerId = document.getElementById('bloggerId').value;
	var bloggerPassword = document.getElementById('bloggerPassword').value;
	this.alert._alertL("Add this search to Blogger");
	this.alert._setContentL(
	'<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">'
  + '   <tr>'
  + '     <td width="336"><table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr>'
  + '         <td colspan="2" class="maintext"><strong>Sign in to Blogger to add photos</strong></td>'
  + '        </tr>'
  + '       <tr >'
  + '         <td  class="maintext">Choose the Blogger:</td>'
  + '         <td >'
  + '		      <select id="bloggerType" name="bloggerType">'
  + '				 <option value="Blogger.com">Blogger.com</option>'
  + '				 <option value="Typepad.com">Typepad.com</option>'
  + '             </select>'
  + '          </td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td  class="maintext">User Id:</td>'
  + '         <td ><input id="bloggerId" name="bloggerId" type="text" value="' + bloggerId + '"/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">Password:</td>'
  + '         <td><input id="bloggerPassword" name="bloggerPassword" type="password" value="' + bloggerPassword + '"/></td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td class="maintext">Blog Title:</td>'
  + '         <td><input id="blogTitle" name="blogTitle" type="text" value="PhotoGraphs From Riya"/></td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td class="maintext">&nbsp;</td>'
  + '         <td><img src="images/button-add.gif" onclick="javascript:active.getBloggerBlogs()" border="0" ></td>'
  + '       </tr>'
  + '     </table>'
  + ' 	<table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr id="blogOptions" style="display:none;">'
  + '         <td width="150" class="maintext">Choose the blog:</td>'
  + '         <td>'
  + '		<select id="userBlogs" name="userBlogs">'
  + '        </select></td>'
  + '       </tr>'
  + '       <tr id="bloggerButtons" style="display:none">'
  + '         <td width="150" height="30">&nbsp;</td>'
  + '         <td height="45"><a href="javascript:active.btnSubmitBlogger()"><img src="images/button-add.gif" border="0" ></a> <a href=javascript:active.btnCloseL()><img src="images/button-cancel.gif" border="0" ></a></td>'
  + '       </tr>'
  + '     </table>'
  + '</td>'
  + '     <td width="364" valign="top" class="maintext"><span class="maintext"><br/>'
  + '  <b> Or  </b> cut &amp; paste into my blog page</span><br>'
  + '  <textarea cols="40" rows="9">'+gEmbed
  + '</textarea></td>'
  + '   </tr>'
  + '</table>');
};

SearchPage.prototype.getBloggerBlogs = function(){
	var username = DOM.getValue("bloggerId");
	var password = DOM.getValue("bloggerPassword");
	var bloggerSelect=document.getElementById("bloggerType");
	var bloggerType=bloggerSelect.options[bloggerSelect.selectedIndex].value;
    ajaxHandler.getUserBlogs(username,password,bloggerType);
}

SearchPage.prototype.updateUserBlogs = function (blogs)
{
//	if(blog == null)
//		return;
	
	var root = blogs.documentElement;
	if(root == null)
		return;
	var blogNodes  = root.childNodes;
	var blogSelect = document.getElementById('userBlogs');

	for (var i=0;i<blogNodes.length ;i++ )
	{
		var blogId = blogNodes[i].getAttribute('blogId');
		var blogName = blogNodes[i].getAttribute('blogName');
		var el = document.createElement("option");
		el.value = blogId;
		el.innerHTML = blogName;
		blogSelect.appendChild(el);
	}

	DOM.show('blogOptions');
	DOM.show('bloggerButtons');
}

SearchPage.prototype.btnSubmitBlogger = function() {
	var username = DOM.getValue("bloggerId");
	var password = DOM.getValue("bloggerPassword");
	var blogTitle = $('blogTitle').value;
	var blogSelect = document.getElementById('userBlogs');
	var blogId = blogSelect.options[blogSelect.selectedIndex].value;
	var bloggerSelect=document.getElementById("bloggerType");
	var bloggerType=bloggerSelect.options[bloggerSelect.selectedIndex].value;
	ajaxHandler.submitBlogger(username, password, location.href, blogId,blogTitle,'thumbNailView','',bloggerType);
	
	this.btnCloseL();
};

SearchPage.prototype.btnSubmitMySpace = function() {
	var username = DOM.getValue("msemail");
	var password = DOM.getValue("mspassword");
	var interest = DOM.getValue("msinterest");
	
	var bulletin = DOM._getElement("msbulletin").checked;
	
	ajaxHandler.submitMySpace(username, password, location.href, interest, bulletin);
	
	this.btnCloseL();
};


SearchPage.prototype.btnRSSURL = function() {
	var searchLocation = location.href;
	
        if( searchLocation.match(/\/search\//gi) ) {
            var rssURL = searchLocation.replace(/\/search\//gi, '/rss/search/');
        } else if( searchLocation.match(/\/album\//gi) ) {
            var rssURL = searchLocation.replace(/\/album\//gi, '/rss/album/');
        } else if( searchLocation.match(/\/catalog\//gi) ) {
            var rssURL = searchLocation.replace(/\/catalog\//gi, '/rss/catalog/');
        } else if( searchLocation.match(/\/popular\//gi) ) {
            var rssURL = searchLocation.replace(/\/popular\//gi, '/rss/popular/');
        } else {
            var rssURL = searchLocation.replace('/search','/rss');
        }

	this.alert._alertS("URL for RSS Feed of this search result.");
	this.alert._setContentS('<textarea class="rss">'+rssURL+'</textarea>');
};

SearchPage.prototype.btnDownloadAll = function() {
	var imageIds = this.getAllPhotoImageIds();
	
	if( imageIds ) {
		ajaxHandler.downloadAll(imageIds);
	} else {
		alert('You do not have permission to download any of these photos.');
	}
};

SearchPage.prototype.btnRequestSubmit = function() {
	var messageText = DOM.getValue('textarea_msgRequest');
	var encryptedImageId = DOM.getValue('encryptedImageId');
	
	this.btnCloseM();
	
	ajaxHandler.requestImage( encryptedImageId, messageText );	
};

SearchPage.prototype.sortBy = function(type) {
	var url = location.href;
	
	if( url.match(/sortBy=\d{0,1}/gi) ) {
		location = url.replace( /sortBy=\d{0,1}/gi, 'sortBy='+type );
	} else {
		location = url + '&sortBy='+type;
	}
};

SearchPage.prototype.showAddTags = function(show, hide) {

	$(show).style.display = 'block'; 
	$(hide).style.display = 'none';

}

SearchPage.prototype.btnTagSelected = function() {
	
		var tagVal = DOM.getValue('tagSelected');

		if( tagVal ) {
			var selectedP = this.getSelectedPhotoImageIds();

			if( selectedP ) {
				ajaxHandler.addImageTag( selectedP, tagVal );
			}

			DOM.setValue( 'tagSelected', '' );

			this.unHighlightSelected();

			if( selectedP ) {
				alert( 'All selected photos have been tagged as \"' + tagVal + '.\"' );
			} else {
				alert( 'You haven\'t selected any photos.' );
			}
		}
	
};


SearchPage.prototype.btnAddATag = function(imageID) {
	//if( gIsLoggedIn ) {
		var tagVal = DOM.getValue('tagSelected_'+imageID);
		if (tagVal == "")
		{
			return;
		}
		if( Util.isNameValid(tagVal) ) {
			ajaxHandler.addImageTag( imageID, tagVal );
			var a = $('tagContainer_'+imageID).innerHTML;
			var b = a+", "+tagVal;
			var c = b.split(",")
				var temp = '';
			if (c.length>4){
				d = c.length - 4;
				for(ii=d;ii<c.length;ii++){
				temp += c[ii] + (ii < c.length-1 && ii < 4 ? ', ' : '');
				$('tagContainer_'+imageID).innerHTML = temp;
				}
			}else{
				$('tagContainer_'+imageID).innerHTML = b;
			}
			$('tagSelected_'+imageID).value = '';
			$('tagHidden_'+imageID).value = "false";
			this.unHighlightSelected();
		}else{
			alert('Tags can only contain alphanumerics.');
		}
		
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to tag.  Click OK to login.');
	//}
};


SearchPage.prototype.btnGotoPrivate = function() {
	if( gIsLoggedIn ) {
		Util.pinMyPhotos();
		
		location = this._getUnscopedUrl(gPermissionPrivate);
	} else {
		location = '/login';
	}
};

SearchPage.prototype.btnGotoPublic = function() {
	Util.pinEveryonesPhotos();
	
	location = this._getUnscopedUrl(gPermissionPublic);
};

SearchPage.prototype._getUnscopedUrl = function(permission) {
	var url = location.href;
	
	url = url.replace('#', '');
	
	if( url.match(/scope=\d{0,3}/gi) ) {

		url = url.replace( /scope=\d{0,3}/gi, 'scope='+permission );

	} else {

		url += ( url.match(/\?/gi) ? '&' : '?' ) + 'scope='+permission;
	
	}
	
	return url;
};
function UscController() {}

UscController.prototype = new ActiveManualTraining;
UscController.prototype.startAutoRecoFlag = false;

UscController.prototype.btnTagFace = function(select, faceUrl) {
	if( select.selectedIndex == 1 ) {
		this.alert.addNewContact(select, faceUrl);
	}
};

UscController.prototype.btnTagCluster = function(select, faceUrl) {
	if( select.selectedIndex == 1 ) {
		this.alert.addNewContact(select, faceUrl);
	} else {
		var faceDrops = DOM.getElementsByClassName(select.id+'_table', 'addressBookSelect');
		for( var i=0; i < faceDrops.length; i++ ) {
			faceDrops[i].selectedIndex = select.selectedIndex;
		}
	}
};

UscController.prototype.btnAssignAdd = function(selectId) {
	var selectedIndex = this.alert.assignAdd(selectId);
	
	if( selectedIndex > 0 ) {
		var cluster = document.getElementById(selectId+'_table');
		if( cluster ) {
			var faceDrops = DOM.getElementsByClassName(cluster, 'addressBookSelect');
			for( var j=0; j < faceDrops.length; j++ ) {
				faceDrops[j].selectedIndex = selectedIndex;
			}
		}
	}
};

UscController.prototype.startAutoReco = function() {
	DOM.setValue( 'redirectUrl', '/usc' );
	active.startAutoRecoFlag = true;
	this.btnFormSubmit();
};

function PeopleHandler() {
}
PeopleHandler.prototype = new ActiveShare;

PeopleHandler.prototype.showContact = function(contactId, contactUserId, name, email, elemName, faceId,nickName,birthDay,birthMonth,birthYear,
	gender,sharedWith,sharedBy ) {
	name = Util.revertSafeString(name);
	nickName = Util.revertSafeString(nickName);
	email = Util.revertSafeString(email);
	
	this.alert._alertXL(name);
	var url = '/displayContact?btnShowContact=btnShowContact'
		+ '&contactId='+ contactId
		+ '&name=' + name
		+ '&email=' + email;
	if(birthYear)
		url = url + '&birthYear=' + birthYear;
	if(birthMonth)
		url = url + '&birthMonth=' + birthMonth;
	if(birthDay)
		url = url + '&birthDay=' + birthDay;

	if(gender)
		url = url + '&gender=' + gender;

	if(nickName)
		url = url + '&nickName=' + nickName;
	if(faceId)
		url = url + '&faceId=' + faceId;
	if(sharedWith)
		url=url + '&sharedWith=' + sharedWith;

	if(sharedBy)
		url=url + '&sharedBy=' + sharedBy;

	this.getContactHtml(url,document.getElementById(elemName),contactId,contactUserId,email,name,sharedWith,sharedBy,faceId);

};


PeopleHandler.prototype.getContactHtml = function(url,divElement,contactId,contactUserID,contactEmail,contactName,sharedWith,sharedBy,faceId){
	var xmlHttp = DOM.getXmlHttp();
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
					
					active.alert._setContent('XL',xmlHttp.responseText);
					var trainingSetHtml = hashedTrainingSet[contactId];
					if( trainingSetHtml &&  trainingSetHtml!= '')
					{
						document.getElementById('trainingSet').innerHTML = trainingSetHtml;
					}
					else{
						active.getTrainingSetHtml(contactUserID, contactEmail,contactId,hashedTrainingSet,contactName,faceId);
					}

				}
			}
	}

		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
};



PeopleHandler.prototype.getTrainingSetHtml = function(contactUserID, contactEmail,id,hashedTrainingSet,fullName,faceId) {
	if(!contactEmail || contactEmail=='null'){
		contactEmail = "";
	}
	var url = '/trainingSet?btnGetTrainingSet=btnGetTrainingSet'
		+ '&contactUserId='+ contactUserID
		+ '&email='+ contactEmail
		+ '&contactId='+ id
		+ '&fullName='+ fullName
                + '&faceId='+ faceId;

		active.getTrainingSetHtmlAjax(url,id,hashedTrainingSet);
	};

PeopleHandler.prototype.getTrainingSetHtmlAjax = function(url, id,hashedTrainingSet) {
		var xmlHttp = DOM.getXmlHttp();
		
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
					document.getElementById('trainingSet').innerHTML = xmlHttp.responseText;
					
					hashedTrainingSet[id] =  xmlHttp.responseText;

				}
			}
		}

		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
	};


PeopleHandler.prototype.deleteFromTrainingSet = function(contactUserID, contactEmail,id,hashedTrainingSet,fullName, faceId) {
	if(!contactEmail || contactEmail=='null'){
		contactEmail = "";
	}
        var contactFaceId = document.getElementById('contactFaceId_' + id).value;
	var oldFaceId = '';
    
	
        var url = '';
		if(faceId){
			oldFaceId = faceId.substring(0,40) + '_' + faceId.substring(40);
		}
	 if(oldFaceId == contactFaceId){
         var pageName ;
         if(document.getElementById('pageName'))
            pageName = document.getElementById('pageName').value;
          url = "/displayContact?btnDeleteFromTrainingSet=btnDeleteFromTrainingSet&contactId="+ id+ "&page=" +
			  pageName+"&name="+ fullName +"&email=" + contactEmail + "&faceId=" + faceId;
          this.updateContactElement(url,id,fullName,contactEmail,faceId);

          

        }
	else
        { 
           url = '/ajaxHandler?action=deleteFromTrainingSet'
		+ '&contactUserId='+ contactUserID
		+ '&contactId='+ id
		+ '&email='+ contactEmail
		+ '&fullName='+ fullName
		+ '&faceId='+ faceId;
           ajaxHandler.ajaxSend(url);
		var imageElement = document.getElementById('trainingSetImageContainer_' + faceId);
		var parent = document.getElementById('trainingSetContainer');
		parent.removeChild(imageElement);
		if(document.getElementById('trainingSet'))
		hashedTrainingSet[id] = document.getElementById('trainingSet').innerHTML;
	}
        
	
        
};
PeopleHandler.prototype.updateContactElement = function(url, contactId, name,email, faceId) 
{
  
  var xmlHttp = DOM.getXmlHttp();
  xmlHttp.onreadystatechange = function() {
  if (xmlHttp.readyState == 4) 
  {
    if (xmlHttp.status == 200) 
    {
      document.getElementById(name.toLowerCase() +'_' + email).innerHTML = xmlHttp.responseText;
	  var imageElement = document.getElementById('trainingSetImageContainer_' + faceId);
	  var parent = document.getElementById('trainingSetContainer');
	  parent.removeChild(imageElement);
	  if(document.getElementById('trainingSet'))
	  hashedTrainingSet[contactId] = document.getElementById('trainingSet').innerHTML;
    }
  }
}

  xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
  xmlHttp.send(null);
  
  }

PeopleHandler.prototype.editContact = function(contactId, oldName,name, oldEmail,email, faceId,nickName,birthDay,birthMonth,birthYear ) {
	var gender ;
	name = Util.revertSafeString(name);
	oldName = Util.revertSafeString(oldName);
	nickName = Util.revertSafeString(nickName);
	var maleElement = document.getElementById("male_"+ contactId);
	var sharedWith = document.getElementById("sharedWith");
	var sharedWithVal ;
	if(sharedWith.checked)
		sharedWithVal = "Y";
	else
		sharedWithVal = "N";

	var sharedBy = document.getElementById("sharedBy");
	var sharedByVal ;
	if(sharedBy.checked)
		sharedByVal = "Y";
	else
		sharedByVal = "N";

	if(maleElement.checked)
	  gender = maleElement.value;
	else
	{
	  var femaleElement = document.getElementById("female_"+ contactId);
	  if(femaleElement.checked)
		gender = femaleElement.value;
	}
	var errorMsg ;
        errorMsg = Util.isDateValid(birthYear,birthMonth,birthDay);
        if( errorMsg ) {
          alert(errorMsg);
          return;
	}
	if(Util.isFutureDate(birthYear,birthMonth,birthDay))
	{
		alert('Birth Date cannot be future.');
		return ;
	}
	
	if( email != oldEmail && myAddressBook.emails.contains(email) ) {
		errorMsg = email + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(email) + '\' from the list or type in a new email address.';	
	}
	
	if( errorMsg ) {
		alert(errorMsg);
		
		return;
	}
	
	myAddressBook.remove(oldName);
	myAddressBook.insert(name,email);
	
	name = Util.trim(name);
	if(email)
		email = Util.trim(email);
		
        
	var url = '/displayContact?btnEditContact=btnEditContact&showDetails=Y' + '&contactId='+ contactId
			+ '&name=' + name 		+ '&oldName=' + oldName
			+ '&email=' + email		+ '&oldEmail=' + oldEmail
			+ '&faceId=' + faceId		+ '&nickName=' + nickName
			+ '&birthDay=' + birthDay	+ '&birthMonth=' + birthMonth
			+ '&gender=' + gender		+ '&birthYear=' + birthYear 
                        + '&sharedBy='+ sharedByVal     + '&sharedWith='+ sharedWithVal	;
		
		var xmlHttp = DOM.getXmlHttp();
		xmlHttp.onreadystatechange = function() {
				if (xmlHttp.readyState == 4) {
					if (xmlHttp.status == 200) {
						var error = '';
						var contactElement = document.getElementById('contact_' + oldName + '_' + oldEmail);
						if(contactElement){
						var trainingSetHtml = document.getElementById('trainingSet').innerHTML;
						active.alert._alertXL(name);
						active.alert._setContent('XL',xmlHttp.responseText);
						document.getElementById('trainingSet').innerHTML = trainingSetHtml;
						}
						error = document.getElementById("errorPresent");
						if(!error || error.value != 'true' || (!contactElement))
							active.getNewContactHtml(contactId, oldName,name, oldEmail,email, faceId,nickName,birthDay,birthMonth,birthYear,gender,sharedWithVal, sharedByVal);
						
						if(error && error.value == 'true'){
							myAddressBook.remove(name);
							myAddressBook.insert(oldName,oldEmail);						
						}
					}
				}
		}
		
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
	
};

PeopleHandler.prototype.getNewContactHtml= function(contactId, oldName,name, oldEmail,email, faceId,nickName,birthDay,birthMonth,birthYear,gender,sharedWith,sharedBy)
{	
	name = Util.trim(name);
	var pageName ;
	if(document.getElementById('pageName'))
		pageName = document.getElementById('pageName').value;
              if(!email)
                email = '';
              var oldContactElement = document.getElementById(oldName.toLowerCase() + "_" + oldEmail);
              var url = '/displayContact?btnShowContact=btnShowContact' + '&showDetails=N&contactId='+ contactId
              + '&name=' + name 		+ '&oldName=' + oldName
              + '&email=' + email		+ '&oldEmail=' + oldEmail
              + '&faceId=' + faceId		+ '&nickName=' + nickName
              + '&birthDay=' + birthDay		+ '&birthMonth=' + birthMonth
              + '&gender=' + gender		+ '&birthYear=' + birthYear + '&sharedBy='+ sharedBy + '&sharedWith='+ sharedWith	;
              if(pageName)
                 url = url + '&page=' + pageName;
              var xmlHttp = DOM.getXmlHttp();
              xmlHttp.onreadystatechange = function() 
              {
                      if (xmlHttp.readyState == 4) 
                      {
                              if (xmlHttp.status == 200) 
                              {
                                      
                                      var parent = oldContactElement.parentNode;
                                      parent.removeChild(oldContactElement);
                                      var newContactElement = document.createElement("div");
                                      newContactElement.id = name.toLowerCase() +"_" + email;
                                      newContactElement.className = 'peopleOuter';

                                      newContactElement.innerHTML = xmlHttp.responseText;
                                      var contactContainer = document.getElementById("contactPeople");
                                      var contacts = DOM.getElementsByClassName(contactContainer,"peopleOuter");
                                      var inserted = false;
                                      for(var i=0;i<contacts.length;i++)
                                      {
                                              if(name.toLowerCase() < contacts[i].id )
                                              {
                                                      contactContainer.insertBefore( newContactElement, contacts[i] );
                                                      inserted = 'true';
                                                      break;

                                              }
                                      }
                                      if(!inserted)
                                        // contactContainer.appendChild(newContactElement);
									  											myAddressBook.insert(name,email);

                                       // if training sets are not moved then display them too
                                      if(oldEmail != email || ( !oldEmail && oldName != name))
                                      {
                                              hashedTrainingSet[contactId] = '';
                                              document.getElementById('trainingSet').innerHTML = '';
                                      }
									 
                          }

                      }

	}
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
};

PeopleHandler.prototype.share = function(name,url,faceId,shareUrl)
{
	if(gIsLoggedIn){
	name = Util.revertSafeString(name);
	this.alert.shareWelcome(name,url,faceId,shareUrl);
	}
	else
	{
		this.tagRedirectLogin('You must be logged-in to share this photo.  Click OK to login.');
	}
};

PeopleHandler.prototype.addContact = function() {
	
	var name = document.getElementById("newContactName").value;
	var email = document.getElementById("newContactEmail").value;
	var nickName = document.getElementById("newContactNickName").value;
	var birthDay = document.getElementById("newContactBirthDay").value;
	var birthMonth = document.getElementById("newContactBirthMonth").value;
	var birthYear = document.getElementById("newContactBirthYear").value;
	var gender = document.getElementById("newContactGender").value ;
	var errorMsg = Util.addressNotValid(name, email);
        if( errorMsg ) {
          alert(errorMsg);
          return;
	}
        errorMsg = Util.isDateValid(birthYear,birthMonth,birthDay);
        if( errorMsg ) {
          alert(errorMsg);
          return;
	}
	if(Util.isFutureDate(birthYear,birthMonth,birthDay))
	{
		alert('Birth Date cannot be future.');
		return ;
	}

		
	var result = myAddressBook.insert(name, email);

	if( !result.success ) {
		if( !result.nameSuccess ) {
			errorMsg = name + ' is already in your Address Book.';
		} else if( !result.emailSuccess ) {
			errorMsg = email + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(email) + '\' from the list or type in a new email address.';
		}
		
		alert(errorMsg);
		
		return;
	}
        
	name = Util.trim(name);
	if(email)
		email = Util.trim(email);
	if(document.getElementById('pageName'))
            pageName = document.getElementById('pageName').value;
	var url = '/displayContact?btnAddContact=btnAddContact'
		+ '&name=' + name
		+ '&email=' + email	
		+ '&nickName=' + nickName
		+ '&birthDay=' + birthDay	
		+ '&birthMonth=' + birthMonth
		+ '&gender=' + gender		
		+ '&birthYear=' + birthYear
		+ '&pageName='+ pageName;
	
	var xmlHttp = DOM.getXmlHttp();
	xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				if (xmlHttp.status == 200) {
                                      var newContactElement = document.createElement("div");
                                      newContactElement.id = name.toLowerCase() +"_" + email;
                                      newContactElement.className = 'peopleOuterNew';
					newContactElement.innerHTML = xmlHttp.responseText;
					var contactContainer = document.getElementById("contactPeople");
					var contacts = DOM.getElementsByClassName(contactContainer,"peopleOuterNew");
					var inserted = false;
					for(var i=0;i<contacts.length;i++)
					{
						if(name.toLowerCase() < contacts[i].id)
						{
							contactContainer.insertBefore( newContactElement, contacts[i] );
							inserted = 'true';
							break;

						}
					}
					if(!inserted)
						contactContainer.appendChild(newContactElement);
					
					 alert("Contact added Successfully");
                                         active.clearFields();
                                         
				}
			}
	}
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
};

PeopleHandler.prototype.postShareSubmit = function(name,email) {
	var url = '/displayContact?btnShowContactByEmail=btnShowContactByEmail' + '&email='+ email+'&showDetails=N';
	var xmlHttp = DOM.getXmlHttp();
	xmlHttp.onreadystatechange = function() 
	{
		if (xmlHttp.readyState == 4) 
		{
			if (xmlHttp.status == 200) 
			{
				var oldContactElement = document.getElementById(name.toLowerCase());
				var parent = oldContactElement.parentNode;
				parent.removeChild(oldContactElement);
				myAddressBook.remove(name);
				var newContactElement = document.createElement("div");
				newContactElement.id = name.toLowerCase();
				newContactElement.className = 'peopleOuterNew';
				newContactElement.innerHTML = xmlHttp.responseText;
				var contactContainer = document.getElementById("contactPeople");
				var contacts = DOM.getElementsByClassName(contactContainer,"peopleOuterNew");
				var inserted = false;
				for(var i=0;i<contacts.length;i++)
				{
					if(name.toLowerCase() < contacts[i].id )
					{
						contactContainer.insertBefore( newContactElement, contacts[i] );
						inserted = 'true';
						break;

					}
				}
				if(!inserted)
					contactContainer.appendChild(newContactElement);
					myAddressBook.insert(name,email);

			
			}
		
		}

	}
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);

};

  PeopleHandler.prototype.clearFields= function() 
  {
    document.getElementById("newContactName").value = '';
    var email = document.getElementById("newContactEmail").value = '';
    document.getElementById("newContactNickName").value = '';
    document.getElementById("newContactBirthDay").selectedIndex = 0;
    document.getElementById("newContactBirthMonth").selectedIndex = 0;
    document.getElementById("newContactBirthYear").selectedIndex = 0;
    document.getElementById("newContactGender").selectedIndex = 0;
  }

PeopleHandler.prototype.hideContact = function (contactNameEmail,cBox){
	var myContacts = new OrderedList();
	DOM.hide(document.getElementById('border_' + contactNameEmail));
	DOM.hide( contactNameEmail);
	contactNameEmail = contactNameEmail.toLowerCase();
	var index = contactNameEmail.indexOf("_");
	var name = contactNameEmail.substr(0,index);
	DOM.hide(document.getElementById(name));
	var email = '';
	if(index != contactNameEmail.length-1)
	email = contactNameEmail.substr(index + 1);
	myContacts.remove(name);
	cBox.checked = false;
}

PeopleHandler.prototype.deleteContacts = function ()
{
	var contactIds = '';
	var contacts = document.peopleForm.check_contact;
	var contactEmail ='';
	for(var i=0;i<contacts.length;i++)
	{
		if(contacts[i].checked)
		{
			var contactNameEmail = contacts[i].value;
			contactIds += ',' + document.getElementById('contactId_' + contactNameEmail).value;
		}
	}
	if(contactIds == ',' || contactIds == '')
	{
		alert("Please select a contact to delete");
		return;
	}
	active.deleteContactsAjax(contactIds);
	
}

PeopleHandler.prototype.deleteContactsAjax = function(contactIds)
{
	if(contactIds == '')
	{
		alert('Please select contacts to delete');
		return;
	}
	var url = AjaxHandler.WWW_AJAX_URL
		+ 'action=deleteContactsAndGroups'
		+ '&contactIds=' + contactIds;
	
	var xmlHttp = DOM.getXmlHttp();
	xmlHttp.onreadystatechange = function() 
	{
		if (xmlHttp.readyState == 4) 
		{
			if (xmlHttp.status == 200) 
			{
				var status = xmlHttp.responseText;
				if(status == '0')
				{
					alert('Contacts deleted Successfully');
					active.hideDeletedContacts();
				}
				else if(status == '1')
				{
					location = '/login';
				}
				else if( status == '2')
				{
					alert('Riya is running recognition.  Please try deleting the contact later.');
				}
				else if( status == '4')
				{
					alert("Riya has recognized more faces.  Please click the 'Manual Training' tab double-check Riya's work before deleting a contact.");
				}
				else
				{
					alert("Contacts couldn't be deleted.  Please try again in a few minutes.");
				}


			}
		}
	}
	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);

}

PeopleHandler.prototype.getCheckedContacts = function ()
{
	var contactIds = '';
	var contacts = document.peopleForm.check_contact;

	var contactEmail ='';
	if(contacts && (!contacts.length) && !contacts.disabled && contacts.checked)
	{
		contactIds = document.getElementById('contactId_' + contacts.value).value;
		return contactIds ;

	}
	else
	{
		for(var i=0;i<contacts.length;i++)
		{
			if(contacts[i].checked)
			{
				var contactNameEmail = contacts[i].value;
				contactIds += ',' + document.getElementById('contactId_' + contactNameEmail).value;
				return contactIds;
			}
		}
	}
}

PeopleHandler.prototype.hideDeletedContacts = function()
{
	var contacts = document.peopleForm.check_contact;
	var contactEmail ='';
	for(var i=0;i<contacts.length;i++)
	{
		if(contacts[i].checked)
		{
			var contactNameEmail = contacts[i].value;
			active.hideContact(contactNameEmail,contacts[i]);
		}
	}
	DOM.hide(document.getElementById("contactDiv"));
	document.peopleForm.main_check.checked = false;
}

function MailHandler() {

}

MailHandler.prototype.getMessages = function(messageType, startNumber)
{
	var url = '/messages?messageType='+ messageType + '&pageNumber=' + startNumber;
	if (startNumber == 0)
	{
		nextStartMessageNumber = 0;
		deletedMessages = 0;

	}

	var xmlHttp = DOM.getXmlHttp();
	xmlHttp.onreadystatechange = function() 
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200)
			{
				var messageDiv = document.getElementById('messages');
				messageDiv.innerHTML = xmlHttp.responseText;
			}
		}

	}
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
}


MailHandler.prototype.showMeMore = function(messageType, startNumber)
{
	var url = '/messages?messageType='+ messageType + '&pageNumber=' + (startNumber) + '&deletedCount='+ deletedMessages;
	var xmlHttp = DOM.getXmlHttp();
	xmlHttp.onreadystatechange = function() 
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200)
			{
				var messageDiv = document.getElementById('messages');
				var newDiv = document.createElement("div");
				newDiv.innerHTML = xmlHttp.responseText;
				DOM.hide(document.getElementById("showMeMore_" + (startNumber)));
				messageDiv.appendChild(newDiv);
				
			}
		}

	}
		xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
		xmlHttp.send(null);
}


MailHandler.prototype.responseImage = function(id,sendToID,imageID,permissionAction)
{
	var messageText = document.getElementById('textbox_' + id).value;
	var url = '/ajaxHandler?action=responseImage&messageText='+ messageText 
			+ '&sendToID='+sendToID+'&imageID='+ imageID + '&permissionAction='+ permissionAction;
	ajaxHandler.ajaxSend( url );
}
function Album() {}


Album.prototype = new ActiveShare;


Album.prototype.share = function(name,url,width,height,shareLink,imageId) {

	this.alert.shareAlbum(name,url,width,height,shareLink,imageId);

};


Album.prototype.changeAccess = function(folderId, accessLevel)

{

	var url = '/ajaxHandler?action=changeImageAccessLevel&folderID=' + folderId

			+ '&imageAccessLevel=' + accessLevel;

	ajaxHandler.ajaxSend(url);

	if(accessLevel == gPermissionPublic)

	  alert('Riya has received your request to make this album public. If Riya is really busy, this may take several minutes.');

	else

	  alert('Riya has received your request to make this album private. If Riya is really busy, this may take several minutes.');


}
function HighResController(pageNumber) {
	// tag editing
	this.sceneState = false;
	this.locationState = false;
	this.REGEX_TAG = '^[a-zA-Z0-9\\s][a-zA-Z0-9\\s:]*[a-zA-Z0-9\\s]$';

	// ajax pagination
	this.pageNumber = pageNumber;
	
	// contact assignment
	this.currentOverlay = '';
	
	// overlays
	this.overlays = '';
	
	// tabbing
	this.i = 0;
	
	// image dimensions
	this.imageId = '';
	this.hRatio = '';
	this.vRatio = '';
	this.marginLeft = '';
	this.marginTop = '';
	
	// override
	this.shareAction = 'giveOneImage';
	
	// slideshow
	this.slideCountdown = 0;
	this.slideIntervalId = 0;
	this.slideOn = false;
}

HighResController.prototype = new ActiveShare;

HighResController.prototype.initImageDimensions = function() {
	this.imageId = DOM.getValue('imageId');
	this.hRatio = DOM.getValue('hRatio');
	this.vRatio = DOM.getValue('vRatio');
	this.marginLeft = DOM.getValue('marginLeft');
	this.marginTop = DOM.getValue('marginTop');
};

HighResController.prototype.initUrl = function(servlet) {
	var url = location.href;

	return url.replace('photo', servlet).replace(/pageNumber=\d{1,3}/gi, 'pageNumber=');
};

HighResController.prototype.btnMarkAdult = function(imageId) {
    ajaxHandler.markAdult(imageId);
    
    alert('Photo marked adult.  Please allow a few minutes for our search engine to clue-in.\n\n.');
};

HighResController.prototype.btnScene = function(imageId) {	
	this.toggleControl('showScene', 'editScene', 'btnScene', this.sceneState);
	
	if( this.sceneState ) {
		// AJAX CALL
		ajaxHandler.editSpecialTags( imageId, DOM.getValue('editScene'), '', '' );
	}
	
	this.sceneState = !this.sceneState;
};

HighResController.prototype.btnLocation = function(imageId) {
	//if( gIsLoggedIn ) {
		this.toggleControl('showLocation', 'editLocation', 'btnLocation', this.locationState);

		if( this.locationState ) {
			// AJAX CALL
			ajaxHandler.editSpecialTags( imageId, '', DOM.getValue('editLocation'), '' );
		}

		this.locationState = !this.locationState;
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to edit the location.  Click OK to login.');
	//}
};

HighResController.prototype.btnLocationEdit = function(imageId){
	
	this.alert._alertM("Add Location Tag");
	this.alert._setContentM(active.locationEdit(imageId));
}

HighResController.prototype.locationEdit = function(imageId){
		
	var locationContent = ' <table cellspacing=0 cellpadding=5 align=center style=\"padding-top:15px;\" >   '
	+ '  <tr>   '
	+ '  	<td valign=top align=left class=\"maintext\">Street</td>   '
	+ '  	<td colspan=3 align=left><input type=text id=street size=60 style=\"width:350px;\" /></td>   '
	+ '  </tr>   '
	+ '  <tr>   '   
	+ '  	<td valign=top align=left class=\"maintext\">City</td>   '
	+ '  	<td align=left><input type=text id=city size=25 /></td>   '
	+ '  	<td valign=top align=left class=\"maintext\">State</td>   '
	+ '  	<td align=left><select id=state><option value=selectState>choose state</option><option  value=AL>Alabama<option  value=AK>Alaska<option  value=AZ>Arizona<option    value=AR>Arkansas<option  value=CA>California<option  value=CO>Colorado<option  value=CT>Connecticut<option  value=DE>Delaware<option  value=FL>Florida<option  value=GA>Georgia<option  value=HI>Hawaii<option  value=ID>Idaho<option  value=IL>Illinois<option  value=IN>Indiana<option  value=IA>Iowa<option value=KS>Kansas<option  value=KY>Kentucky<option  value=LA>Louisiana<option  value=ME>Maine<option  value=MD>Maryland<option  value=MA>Massachusetts<option  value=MI>Michigan<option  value=MN>Minnesota<option  value=MS>Mississippi<option  value=MO>Missouri<option  value=MT>Montana<option  value=NE>Nebraska<option   value=NV>Nevada<option  value=NH>New Hampshire<option  value=NJ>New Jersey<option  value=NM>New Mexico<option  value=NY>New York<option  value=NC>North Carolina<option  value=ND>North Dakota<option  value=OH>Ohio<option  value=OK>Oklahoma<option  value=OR>Oregon<option  value=PA>Pennsylvania<option value=RI>Rhode Island<option  value=SC>South Carolina<option  value=SD>South Dakota<option  value=TN>Tennessee<option  value=TX>Texas<option  value=UT>Utah<option  value=VT>Vermont<option  value=VA>Virginia<option  value=WA>Washington<option  value=DC>Washington D.C.<option value=WV>WestVirginia<option  value=WI>Wisconsin<option  value=WY>Wyoming<option  value=AE>Army Europe<option  value=AP>Army Pacific<option  value=AA>Army America</option></select></td>'
	+ '  </tr>   '
	+ '  <tr>   '
	+ '  	<td valign=top align=left class=\"maintext\">zipcode</td>   '
	+ '  	<td valign=top align=left class=\"maintext\"><input type=text id=zipcode /></td>   '
	+ '  	<td valign=top align=left class=\"maintext\">Country</td>   '
	+ '  	<td colspan=2 align=left><select id=country disabled><option value="USA">United States</usa></select></td>   '
	+ '  </tr>   '
	+ '  <tr>   '
	+ '  	<td colspan=4 valign=top align=left class=\"maintext\"><input align=left type=checkbox id=applyAll value=yes style=\"width:20px\" >Apply to all photos in the album</td>   '
	+ '  </tr>   '
	+ '  <tr>   '
	+ '  	<td><input type=hidden id=imageId value=\"'+imageId+'\"></td>   '
	+ '  	<td colspan=3 align=middle><a href="javascript:active.btnLocationSave()"><img src=images/button-save.gif border=0 onClick=active.btnLocationSave();></td>   '
	+ '  </tr>   '
	+ '  </table>   ';

	return locationContent;

}


HighResController.prototype.btnLocationSave = function(){
var street = $('street').value;
var city = $('city').value;
var state = $('state').value;
var zipcode = $('zipcode').value;
var validZip = false;
validZip = Util.isValidZip(zipcode);
if(validZip){
	alert("Invalid Zipcode, Please enter the correct zipcode");
	$('zipcode').select(); 
	return;
	}


var country = $('country').value;
if($('applyAll').checked){
	var applyAll = 'yes';	
}else{
	var applyAll = 'no';
}
var imageId = $('imageId').value;
ajaxHandler.editLocation( imageId, '', '', '' , street, city, state, zipcode, country, applyAll);
this.btnCloseM();
}


HighResController.prototype.toggleControl = function(showControl, editControl, btn, stateVar) {
	if( stateVar ) {
		DOM.hide(editControl);
		DOM.showInline(showControl);
		
		this.setLink( showControl, DOM.getValue(editControl) );
		
		DOM.setImgSrc( btn, 'images/button-edit.gif' );
	} else {
		this.stopSlideshow();

		DOM.hide(showControl);
		DOM.showInline(editControl);
		
		DOM.setImgSrc( btn, 'images/button-save.gif' );
	}
};

HighResController.prototype.setLink = function( link, value ) {
	DOM.setInnerHTML( link, value );
	DOM.setHref( link, 'javascript:ajaxHandler.findMore(\'' + Util.toSafeString(value) + '\')' );
};

HighResController.prototype.btnTag = function(imageId) {
	//if( gIsLoggedIn ) {
		var newTagEntry = DOM.getValue('newTagEntry');

		if( newTagEntry ) {
			if( Util.isNameValid(newTagEntry) ) {
				var tagContainer = document.getElementById('tagContainer');
				var newTagDiv = document.getElementById('hiddenTag').cloneNode(true);
				var newTagA = DOM.getFirstElementByTagName(newTagDiv, 'a');

				this.setLink(newTagA, newTagEntry);

				tagContainer.appendChild(newTagDiv);

				DOM.showInline(newTagDiv);

				// AJAX CALL
				ajaxHandler.addImageTag( imageId, newTagEntry );

				DOM.setValue( 'newTagEntry', '' );
			} else {
				alert('Tags can only contain alphanumerics.');
			}
		}
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to tag.  Click OK to login.');
	//}
};

HighResController.prototype.btnComment = function(imageId) {
	//if( gIsLoggedIn ) {
		var newCommentEntry = DOM.getValue('newCommentEntry');

		if( newCommentEntry ) {
			var commentContainer = document.getElementById('commentsContainer');
			var newCommentDiv = document.getElementById('hiddenComment').cloneNode(true);
			var newCommentText = DOM.getFirstElementByClassName(newCommentDiv, 'maintext');
			newCommentText.innerHTML = newCommentEntry;

			commentContainer.insertBefore( newCommentDiv, document.getElementById('newCommentContainer') );

			DOM.show(newCommentDiv);

			// AJAX CALL
			ajaxHandler.addImageComment( imageId, escape(newCommentEntry) );

			DOM.setValue( 'newCommentEntry', '' );
		}
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to comment.  Click OK to login.');
	//}
};

HighResController.prototype.btnWhoCanAccess = function(select, imageId) {
	var selected = select.options[select.selectedIndex];
	
	// AJAX CALL
	ajaxHandler.changeImageAccessLevel( imageId, selected.value );

	alert('Riya has made this photo '+selected.innerHTML+'.');
};

HighResController.prototype.btnShare = function(faceUrl, imageId, w, h) {
	if( gIsLoggedIn ) {
		this.alert.shareOne(faceUrl, imageId, w, h);
	} else {
		this.tagRedirectLogin('You must be logged-in to share this photo.  Click OK to login.');
	}
};

HighResController.prototype.postShareSubmit = function(name, email) {
	myAddressBook.emails.insert(email, name);
	
	if( email ) {
		myAddressBook.names.updateHash(name, email);
	}
}

HighResController.prototype.btnAjaxBack = function() {
	if( this.isNotFirstImage() ) {
		this.pageNumber--;

		this.ajax();
	}
};

HighResController.prototype.btnAjaxForward = function() {
	if( this.isNotLastImage() ) {
		this.pageNumber++;

		this.ajax();
	} else {
		this.btnAjaxReset();
	}
};

HighResController.prototype.btnAjaxReset = function() {
	this.pageNumber = 1;
	
	this.ajax();
};

HighResController.prototype.ajax = function() {	
	this.pauseSlideshow();

	DOM.setImgSrc( 'screenResImg', 'images/spacer.gif' );
	
	var xmlHttp = DOM.getXmlHttp();

	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					document.getElementById('page').innerHTML = xmlHttp.responseText;
					
					drawing.attachMouseoverListeners();
					
					active.anchorDown();
					active.initOverlays(true);
					active.initImageDimensions();
					
					if( active.slideOn ) {
						active.startSlideshow();
					}
				}
			} else {
				alert( xmlHttp.status + '\n\n' + xmlHttp.responseText );
			}
		}
	}
	
	var url = this.getSearchPageUrl();

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.setRequestHeader("riyaAjax", "riyaAjax");
	xmlHttp.send(null);
};


HighResController.prototype.replacePageNumber = function(url, pageNumber) {
	if( url.match(/pageNumber=\d{0,3}/gi) ) {
		url = url.replace( /pageNumber=\d{0,3}/gi, 'pageNumber='+pageNumber );
	} else {
		url += '&pageNumber='+pageNumber;
	}
	
	return url.replace(/\&[iI][dD]/gi,'&origId');
};

HighResController.prototype.getSearchPageUrl = function() {
	var params = location.search;
	
	return '/photoContent'+this.replacePageNumber(params, this.pageNumber);
};

HighResController.prototype.btnDownload = function(imageId) {
	ajaxHandler.downloadImage(imageId);
};

HighResController.prototype.startSlideshow = function() {
	if( !this.slideIntervalId ) {
		this.slideOn = true;
		this.slideCountdown = 5;

		var h = this;

		this.slideIntervalId = setInterval( function() { h.slideShow() }, 1000 );

		DOM.setInnerHTML( 'firstRowHref', 'Autoplay Off' );
	}
};

HighResController.prototype.slideShow = function() {
	if( this.slideOn ) {
		this.slideCountdown -= 1;

		if( this.slideCountdown == 0 ) {
			this.btnAjaxForward();
		} else {	
			DOM.setInnerHTML( 'firstRowCenter', 'Next photo in: '+ this.slideCountdown + ' seconds' );	
		}
	}
};

HighResController.prototype.stopSlideshow = function() {
	this.slideOn = false;
	
	this.pauseSlideshow();
	
	// HACK HACK HACK: this is here so that home page can also use this controller;
	// deal w/ more elegantly
	if( DOM.exists('firstRowCenter') ) {
		DOM.setInnerHTML( 'firstRowCenter', '' );	
	}
	
	if( DOM.exists('firstRowHref') ) {
		DOM.setInnerHTML( 'firstRowHref', 'Autoplay On' );
	}
};

HighResController.prototype.pauseSlideshow = function() {	
	clearInterval( this.slideIntervalId );
	
	this.slideIntervalId = '';
};

HighResController.prototype.toggleSlideshow = function() {
	if( this.slideOn ) {
		this.stopSlideshow();
	} else {
		this.startSlideshow();
	}
}

HighResController.prototype.onload = function() {
	this.anchorDown();
	this.attachKeyListener();
	this.initImageDimensions();
};

HighResController.prototype.onunload = function() {
	this.stopSlideshow();
	
	document.onkeyup = '';
};

HighResController.prototype.attachKeyListener = function() {
	document.onkeyup = function(e) {
		if( !active.alert.opened ) {
			var event = new Event(e);
			var wh = event.getTarget().nodeName;
			
			if( DOM.equalsIgnoreCase(wh, 'input') || DOM.equalsIgnoreCase(wh, 'textarea') ) {
				return;
			}

			switch( event.getKeyCode() ) {
				case 9 :
					event.cancelBubble();
					active.btnNextOverlay();
					break;

				case 37 :
					event.cancelBubble();
					active.btnAjaxBack();
					break;

				case 39 :
					event.cancelBubble();
					active.btnAjaxForward();
					break;
			}
		}	
	};
};

HighResController.prototype.btnNextOverlay = function() {
	DOM.show('overlayCanvas');

	this.initOverlays();
	
	if( this.overlays.length > 0 ) {
		this.hideAllBut( this.overlays[this.i] );
	
		this.i = (this.i+1) % this.overlays.length;
	}
};

HighResController.prototype.addOverlay = function(div, canvas) {
	this.showAll();

	var x = DOM.parsePx(div.style.left);
	var y = DOM.parsePx(div.style.top);
	var w = DOM.parsePx(div.style.width);
	var h = DOM.parsePx(div.style.height);

	var url = '/newOverlay'
		+'?x='+x
		+'&y='+y
		+'&w='+w
		+'&h='+h
		+'&imageId='+this.imageId
		+'&hRatio='+this.hRatio
		+'&vRatio='+this.vRatio
		+'&marginLeft='+this.marginLeft
		+'&marginTop='+this.marginTop
		
	this.alert.confirmYesNo(url, 'Is this a face?');
};

HighResController.prototype.processOverlays = function(target) {
	this.stopSlideshow();

	this.initOverlays();

	var targetDiv = DOM.getAncestorOfType( target, 'div' );

	if( this.isDropDown(targetDiv) ) {
		return;
	}
	
	if( this.isOverlay(targetDiv) ) {
		var thisOverlay = DOM.getAncestorOfClass( targetDiv, 'overlayContainer' );
		
		this.hideAllBut(thisOverlay);
	} else {
		this.showAll();
	}
};

HighResController.prototype.initOverlays = function(override) {
	if( !this.overlays || override ) {
		this.overlays = DOM.getElementsByClassName( 'overlayCanvas', 'overlayContainer' );
		
		this.i = 0;
	}
};

HighResController.prototype.showAll = function() {
	for( var i=0; i < this.overlays.length; i++ ) {
		DOM.show( this.overlays[i] );
	}
};

HighResController.prototype.hideAllBut = function(overlay) {
	DOM.show(overlay);
	
	for( var i=0; i < this.overlays.length; i++ ) {
		if( this.overlays[i] != overlay ) {
			DOM.hide( this.overlays[i] );
		}
	}	
};

HighResController.prototype.btnTagFace = function(select, imageId, overlayId, faceNr, faceUrl, isOwner, isManualFace) {
	//if( gIsLoggedIn ) {
		if( select.selectedIndex == 0 ) {				
				try {

					if( Util.isIe6() ) {
						DOM.getBody().focus();
					} else {
						select.blur();
					}

				} catch(e) {}
				
				return;
		}


		if( select.selectedIndex >= 1 ) {
			if( select.selectedIndex >= 2 ) {			
				var option = select.options[select.selectedIndex];
				var delim = option.value.split(gDelimiter);
				var email = delim[0];
				var name = delim[1];

				var doSave = true;
				/* commenting out the validation 
				if( select.selectedIndex > 2 ) {
					var allDrops = DOM.getElementsByClassName('content', 'addressBookSelect');
					for( var j=0; j < allDrops.length; j++ ) {
						if( allDrops[j] != select && allDrops[j].selectedIndex == select.selectedIndex ) {
							alert( 'You\'ve already identified ' + name + ' in this photo.' );

							select.selectedIndex = 0;

							doSave = false;

							break;
						}
					}
				}*/

				if( doSave ) {
					ajaxHandler.assignContact( imageId, overlayId, escape(name), email, faceNr );
					if( select.selectedIndex > 2 && isOwner && !isManualFace) {
						this.alert.uscPrologue( name, email, imageId, faceNr );
					}
				}
				
				try {

					if( Util.isIe6() ) {
						DOM.getBody().focus();
					} else {
						select.blur();
					}

				} catch(e) {}

				
			} else {
				this.currentOverlay = new Overlay(imageId, overlayId, faceNr, isOwner);

				this.alert.addNewContact(select, faceUrl);
			}		
		}
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to tag this face.  Click OK to login.');
	//}
};

HighResController.prototype.btnAssignAdd = function(selectId) {
	var selectedIndex = this.alert.assignAdd(selectId, this.currentOverlay);
	
	if( selectedIndex > 0 ) {
		var imageId = this.currentOverlay.imageId;
		var overlayId = this.currentOverlay.overlayId;
		var faceNr = this.currentOverlay.faceNr;

		var select = document.getElementById(selectId);
		var option = select.options[select.selectedIndex];
		var delim = option.value.split(gDelimiter);
		var email = delim[0];
		var name = delim[1];

		ajaxHandler.assignContact( imageId, overlayId, escape(name), email, faceNr );
		if(this.currentOverlay.isManualFace){
			return;
		}else{
			if( selectedIndex > 2 && this.currentOverlay.isOwner ) {
				this.alert.uscPrologue( name, email, imageId, faceNr );
			}
		}
	}
};

HighResController.prototype.btnDeleteOverlay = function( imageId, overlayId ) {
	//if( gIsLoggedIn ) {
		if( confirm('Are you sure you want to delete this tag?') ) {
			var div = document.getElementById('center_'+overlayId);

			div.parentNode.removeChild(div);

			ajaxHandler.deleteOverlay( imageId, overlayId );
		}
//	} else {
//		this.tagRedirectLogin('You must be logged-in to delete this tag.  Click OK to login.');
//	}
};

HighResController.prototype.btnTagObject = function(div) {
	//if( gIsLoggedIn ) {
		this.btnDisplay(div);
	//} else {
	//	this.tagRedirectLogin('You must be logged-in to tag this object.  Click OK to login.');
	//}
};

HighResController.prototype.btnSaveTag = function( imageId, overlayId ) {
	var dropDown = document.getElementById('dropDown_'+overlayId);
	var caption = document.getElementById('caption_'+overlayId).value;
	
	ajaxHandler.editOverlayTag( imageId, overlayId, escape(caption) );
	
	document.getElementById('tag_'+overlayId).innerHTML = caption;
	
	this.btnDisplay( dropDown );
};

HighResController.prototype.btnDisplay = function(div) {
	DOM.toggleDisplay(div);
	
	drawing.toggleLock();
};

HighResController.prototype.isOverlay = function(div) {
	return div.className == 'overlayCenterInner' 
		|| div.className == 'overlayCenterInnerHighlighted'
		|| div.className == 'overlayLabel';
};

HighResController.prototype.isDropDown = function(div) {
	return div.className == 'dropDown';
};

HighResController.prototype.btnClickSearch = function(defaultText, imageId, faceName, faceId, imageId, overlayId) {
	var overlayTag = DOM.exists('select_'+overlayId) ? DOM.getSelected('select_'+overlayId) : DOM.getInnerHTML('tag_'+overlayId);
	
	if( DOM.equalsIgnoreCase(overlayTag, defaultText) ) {
		alert('You need to tag this box before we can find more photos.');		
	} else {
		ajaxHandler.findMore(overlayTag, imageId, faceName, faceId, imageId, overlayId );
	}
};

HighResController.prototype.btnUscTraining = function( name, email, imageId, faceNr ) {
	this.alert.uscTraining( name, email, imageId, faceNr );
};

HighResController.prototype.btnMoreUscTraining = function( name, email, imageId, faceNr ) {
	this.submitUscTraining( name, email, false );
	
	this.btnUscTraining( name, email, imageId, faceNr );
};

HighResController.prototype.btnUscEpilogue = function( name, email, imageId, faceNr ) {
	this.submitUscTraining( name, email, true );
	
//	if( !Util.getHideUscConfirmation() ) {
//		this.alert.uscEpilogue(  name, email, imageId, faceNr );
//	} else {
		this.alert.closeXL();
//	}
};

HighResController.prototype.btnCloseUscEpilogue = function() {
	if( document.getElementById('hide_msgInlineUscConfirmation').checked ) {
		Util.setHideUscConfirmation();
	}
	
	this.alert.closeL();
};

HighResController.prototype.selectYes = function( id ) {
	document.getElementById(id+'_yes').checked = true;
	document.getElementById(id+'_no').checked = false;
};

HighResController.prototype.selectNo = function( id ) {
	document.getElementById(id+'_yes').checked = false;
	document.getElementById(id+'_no').checked = true;
};

HighResController.prototype.submitUscTraining = function( name, email, doAutoRec ) {
	var acceptedList = '';
	var rejectedList = '';
	
	var inputs = this.alert.getContentXL().getElementsByTagName("input");
	for( var i=0; i < inputs.length; i++ ) {
		if( inputs[i].checked && inputs[i].value == 'no' ) {
			rejectedList += inputs[i].name + ',';
		}
		
		if( inputs[i].checked && inputs[i].value == 'yes' ) {
			acceptedList += inputs[i].name + ',';
		}
	}
	
	ajaxHandler.recognizeSimilarFaces(  name, email, acceptedList, rejectedList, doAutoRec );
	if(doAutoRec){
		Util.startRecognizedAnimation();
	}
};

HighResController.prototype.btnShowNewOverlay = function(url, isFace) {
	url += '&isFace=' + isFace;
	
	var xmlHttp = DOM.getXmlHttp();

	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if( xmlHttp.responseText > '' ) {
					document.getElementById('overlayCanvas').innerHTML += xmlHttp.responseText;
					
					drawing.attachMouseoverListeners();
					active.initOverlays(true);					
					active.btnCloseXS();
				}
			}
		}
	}

	xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
	xmlHttp.send(null);
};

HighResController.prototype.showPreview = function(i, url) {
	var nr = Math.floor((i-1)/3)+1;
	
	DOM.show('previewThumb_'+nr);
	
	DOM.setImgSrc('previewImg_'+nr, url);	
	$('previewBox_'+i).style.borderWidth = "2px"; 
	$('previewBox_'+i).style.borderColor = "#68BD4F"; 
	$('previewBox_'+i).style.borderStyle = "solid";
};

HighResController.prototype.hidePreview = function(i, imageNr) {
	var nr = Math.floor((i-1)/3)+1;

	DOM.hide('previewThumb_'+nr);

	DOM.setImgSrc('previewImg_'+nr, 'images/loading_photo_fast.gif');	

	if( i != imageNr ) {
		$('previewBox_'+i).style.borderWidth = "1px"; 
		$('previewBox_'+i).style.borderColor = "#CED0D2";
		$('previewBox_'+i).style.borderStyle = "solid"; 
	}
};

HighResController.prototype.gotoImage = function(i) {
	this.pageNumber = i;
	
	this.ajax();
};

HighResController.prototype.isNotFirstImage = function() {
	return DOM.exists('previousButton');
};

HighResController.prototype.isNotLastImage = function() {
	return DOM.exists('nextButton');
};

HighResController.prototype.btnDelete = function(imageId) {
	if( gIsLoggedIn ) {
		if( confirm('Are you sure you want to delete this photo?') ) {
			ajaxHandler.deletePhoto(imageId);

			if( this.isNotLastImage() ) {
				this.btnAjaxForward();
			} else if( this.isNotFirstImage() ) {
				this.btnAjaxBack();
			} else {
				location = '/albums';	
			}
			
			alert('Riya has received your request to delete this photo. If Riya is really busy, this may take several minutes.');
		}
	} else {
		this.tagRedirectLogin('You must be logged-in to delete this tag.  Click OK to login.');
	}
};

HighResController.prototype.anchorDown = function() {
	if( Util.isIe6() ) {
		if( document.getElementById('content').scrollTop < 125 ) {
			document.getElementById('content').scrollTop = 125;
		}	
	} else {
		if( DOM.getScrollTo() < 125 ) {
			self.scrollTo(0, 125);
		}
	}
};

//code is same as search page view. will discuss to piyush and make it generic later.4/26/2006
//code is same as search page view. will discuss to piyush and make it generic later.4/26/2006
HighResController.prototype.btnBlogspot = function(imageID) {
	this.alert._alertL("Add this search to Blogger");
	this.alert._setContentL(
	'<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">'
  + '   <tr>'
  + '     <td width="336"><table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr>'
  + '         <td colspan="2" class="maintext"><strong>Sign in to Blogger to add photos</strong></td>'
  + '        </tr>'
  + '       <tr >'
  + '         <td  class="maintext">Choose the Blog:</td>'
  + '         <td>'
  + '		      <select id="bloggerType" name="bloggerType">'
  + '				 <option value="Blogger.com">Blogger.com</option>'
  + '				 <option value="Typepad.com">Typepad.com</option>'
  + '             </select>'
  + '          </td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td  class="maintext">User Id:</td>'
  + '         <td ><input id="bloggerId" name="bloggerId" type="text" value=""/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">Password:</td>'
  + '         <td><input id="bloggerPassword" name="bloggerPassword" type="password" value=""/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">Blog Title:</td>'
  + '         <td><input id="blogTitle" name="blogTitle" type="text" value=""/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">&nbsp;</td>'
  + '         <td><img src="images/button-add.gif" onclick="javascript:active.getBloggerBlogs()" border="0" ></td>'
  + '       </tr>'
  + '     </table>'
  + ' 	<table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr id="blogOptions" style="display:none;">'
  + '         <td width="150" class="maintext">Choose the blog:</td>'
  + '         <td>'
  + '		<select id="userBlogs" name="userBlogs">'
  + '        </select></td>'
  + '       </tr>'
  + '       <tr id="bloggerButtons" style="display:none">'
  + '         <td width="150" height="30">&nbsp;</td>'
  + '         <td height="45"><a href="javascript:active.btnSubmitBlogger('+"'"+imageID+"'"+')"><img src="images/button-add.gif" border="0" ></a> <a href=javascript:active.btnCloseL()><img src="images/button-cancel.gif" border="0" ></a></td>'
  + '       </tr>'
  + '     </table>'
  + '</td>'
  + '     <td width="364" valign="top" class="maintext"><span class="maintext"><br/>'
  + '  <b> Or  </b> cut &amp; paste into my blog page</span><br>'
  + '  <textarea cols="40" rows="9">'+'<img src='+'"'+document.getElementById('screenResImg').src+'" ></img>'
  + '</textarea></td>'
  + '   </tr>'
  + '</table>');
};

HighResController.prototype.getBloggerBlogs = function(){
	var username = DOM.getValue("bloggerId");
	var password = DOM.getValue("bloggerPassword");
	var bloggerSelect=document.getElementById("bloggerType");
	var bloggerType=bloggerSelect.options[bloggerSelect.selectedIndex].value;
    ajaxHandler.getUserBlogs(username,password,bloggerType);
}

HighResController.prototype.updateUserBlogs = function (blogs)
{
//	if(blog == null)
//		return;
	
	var root = blogs.documentElement;
	if(root == null)
		return;
	var blogNodes  = root.childNodes;
	var blogSelect = document.getElementById('userBlogs');

	for (var i=0;i<blogNodes.length ;i++ )
	{
		var blogId = blogNodes[i].getAttribute('blogId');
		var blogName = blogNodes[i].getAttribute('blogName');
		var el = document.createElement("option");
		el.value = blogId;
		el.innerHTML = blogName;
		blogSelect.appendChild(el);
	}

	DOM.show('blogOptions');
	DOM.show('bloggerButtons');
}

HighResController.prototype.btnSubmitBlogger = function(imageID) {
	var username = DOM.getValue("bloggerId");
	var password = DOM.getValue("bloggerPassword");
	var blogTitle = $('blogTitle').value;
	var blogSelect = document.getElementById('userBlogs');
	var blogId = blogSelect.options[blogSelect.selectedIndex].value;
	var bloggerSelect=document.getElementById("bloggerType");
	var bloggerType=bloggerSelect.options[bloggerSelect.selectedIndex].value;
	ajaxHandler.submitBlogger(username, password, location.href, blogId,blogTitle,'koreanView',imageID,bloggerType);	
	this.btnCloseL();
};

HighResController.prototype.btnMySpace = function() {
	this.alert._alertL("Add this search to MySpace");
	this.alert._setContentL(
	'<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">'
  + '   <tr>'
  + '     <td width="300"><table width="100%"  border="0" cellspacing="2" cellpadding="2">'
  + '       <tr>'
  + '         <td colspan="2" class="maintext"><strong>Sign in to MySpace to add photos</strong></td>'
  + '        </tr>'
  + '       <tr >'
  + '         <td width="38%" class="maintext">MySpace Email:</td>'
  + '         <td width="62%"><input id="msemail" name="msemail" type="text"/></td>'
  + '       </tr>'
  + '       <tr >'
  + '         <td class="maintext">MySpace Password:</td>'
  + '         <td><input id="mspassword" name="mspassword" type="password"/></td>'
  + '       </tr>'
  + '		<tr>'
  + '         <td class="maintext">Section:</td>'
  + '         <td><select id="msinterest" name="msinterest">'
  + '           <option value="aboutme">About Me</option>'
  + '           <option value="LikeToMeet">Like To Meet</option>'
  + '           <option value="general">Interests</option>'
  + '           <option value="music">Music</option> '
  + '           <option value="movies">Movies</option>'
  + '           <option value="television">Television</option>'
  + '			<option value="heroes">Heroes</option>'
  + '			<option value="books">Books</option>'
  + '         </select></td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td>&nbsp;</td>'
  + '         <td><input type="checkbox" id="msbulletin" name="msbulletin"/>'
  + 'Post to the bulletin</td>'
  + '       </tr>'
  + '       <tr>'
  + '         <td>&nbsp;</td>'
  + '         <td><a href="javascript:active.btnSubmitMySpace()"><img src="images/button-add.gif" border="0" ></a> <a href=javascript:active.btnCloseL()><img src="images/button-cancel.gif" border="0" ></a></td>'
  + '       </tr>'
  + '     </table></td>'
  + '     <td width="400" valign="top"><span class="maintext"><br/>'
  + '  <b> Or  </b> cut &amp; paste into MySpace</span><br>'
  + '  <textarea cols="40" rows="9">'
  + '</textarea></td>'
  + '   </tr>'
  + '</table>');
};

HighResController.prototype.btnSubmitMySpace = function() {
	var username = DOM.getValue("msemail");
	var password = DOM.getValue("mspassword");
	var interest = DOM.getValue("msinterest");
	
	var bulletin = DOM._getElement("msbulletin").checked;
	
	ajaxHandler.submitMySpace(username, password, location.href, interest, bulletin);
	
	this.btnCloseL();
};

HighResController.prototype.btnURL = function() {		
	this.alert._alertXL("Add this photo to your blog or website");
	this.alert._setContentXL(active.contentURL());
}

HighResController.prototype.contentURL = function(){
	var imgSrcURL = document.getElementById("screenResImg").src;
	var content_URL = ' <table border=0 cellspacing=0 cellpadding=5 width=600 height=400 align=middle> '
	+' <tr>'
	+'		<td valign=top align=left class=\"maintext\">Image URL (Permalink):</td>'
	+'		<td valign=top align=left><input id=\"imgUrl\" value='+imgSrcURL+' type=\"text\" onClick=\"javascript:this.select();\" size=60 style=\"width:340;\"></td>'
	+'	</tr>'
	+'	<tr>'
	+'		<td valign=top align=left class=\"maintext\">Embeddable Tag (HTML):</td>'
	+'		<td valign=top align=left><textarea name=\"imgUrlTArea\" onClick=\"javascript:this.select();\"  rows=\"20\" cols=\"40\"><img src=\"'+imgSrcURL+'\" border=\"0\" width=\"800\" height=\"600\" /></textarea></td>'
	+'	</tr>'
	+'	<tr>'
	+'		<td></td>'
	+'		<td></td> '
	+'	</tr> '	  	
	+'	</table> ';

	return content_URL;
};


HighResController.prototype.btnGotoPrivate = function() {
	if( gIsLoggedIn ) {
		Util.pinMyPhotos();
		
		location = this._getUnscopedUrl(gPermissionPrivate);
	} else {
		location = '/login';
	}
};

HighResController.prototype.btnGotoPublic = function() {
	Util.pinEveryonesPhotos();
	
	location = this._getUnscopedUrl(gPermissionPublic);
};

HighResController.prototype._getUnscopedUrl = function(permission) {
	var url = location.href;
	
	url = url.replace('#', '');
	
	if( url.match(/scope=\d{0,3}/gi) ) {

		url = url.replace( /scope=\d{0,3}/gi, 'scope='+permission );

	} else {

		url += ( url.match(/\?/gi) ? '&' : '?' ) + 'scope='+permission;
	
	}
	
	return url;
};


star_on = new Image()
star_on.src="images/star_on.png";
star_off = new Image()
star_off.src="images/star_off.png";

saveImage=""; 
maxImages=5; 
function swap(img1,on) { 
 /* for next release commenting due to lack of time :-/ 
 var a = img1.split("_");
 img = a[0];
  window.status=(on)?img+'/'+maxImages:''; 
  if (img<=saveImage) return; 
  imgSrc = "star_"+((on)?"on":"off")+".src"; 
  $('img'+img1).src=eval(imgSrc);  */
  return true; 
}

function clickIt(img1, searchText) {
var a = img1.split("_");
 rank = eval(a[0]);
 rank1 = rank+1;
 imageNo = a[1];
 ajaxHandler.rankImage(imageNo, rank, searchText);
 for(i=1;i<rank1;i++){
	img1 = i+"_"+imageNo;
	$('img'+img1).src = "images/star_on.gif";
 }

  for(i=rank1;i<6;i++){
	img1 = i+"_"+imageNo;
	$('img'+img1).src = "images/star_off.gif";
 }
 $('img'+img1).blur();
/* for next release
  for (i=1;i<=maxImages;i++) swap(i+"_"+a[1]); 
  for (i=img;i>=1;i--) swap(i+"_"+a[1],1);
  saveImage=img; 
  window.focus();*/ 
  return false; 
}

function clickItOverlay(img1,imageIdNew,searchTextNew){
	var a = img1.split("_");
	 rank = eval(a[0]);
	 rank1 = rank+1;
	 imageNo = a[1];
	 overlayIdNew = imageNo;
	 ajaxHandler.rankImageOverlay(overlayIdNew, rank, imageIdNew, searchTextNew);
	 for(i=1;i<rank1;i++){
		img1 = i+"_"+imageNo;
		$('img'+img1).src = "images/star_on.gif";
	 }

	  for(i=rank1;i<6;i++){
		img1 = i+"_"+imageNo;
		$('img'+img1).src = "images/star_off.gif";
	 }
	 $('img'+img1).blur();
	 return false; 
	}
/*
 * Controller for simple training page
 */
function SimpleTrainingController(defaultName, defaultEmail) {
		this.HIDE_MESSAGE = 'Hide Instructions';
		this.SHOW_MESSAGE = 'Show Instructions';
		
		this.defaultName = defaultName;
		this.defaultEmail = defaultEmail;
    /*
     * track whether the CTRL key is down (multiple face selection)
     */
    this.ctrlDown = false;
    /*
     * track the group of faces that's currently selected
     */
    this.headArr = new Object();
    
    /*
     * the entire list of faces on the page
     */
    this.heads = null;
    /*
     * the entire list of Address Book contacts on the page
     */
    this.names = null;
    /*
     * track whether faces(s) are currently being dragged
     */
    this.headMouseDown = false;
    /*
     * track the current Address Book contact begin dragged
     */
    this.currentAbook = null;
    /*
     * track the current face being dragged
     */
    this.currentHead = null;
    /*
     * track (a) when dragging face(s), the last Address Book contact moused-over
     * or (b) when dragging a contact, the name and email address of the contact
     */
    this.currentName = '';
    this.currentEmail = '';
    /*
     * the height of the Address Book column; since it's absolute-positioned,
     * the height needs to be set explicitly.  the height is computed by the
     * JSP (it's not very elegant right now)
     */
    this.columnHeight = DOM.getViewportHeight();
    /*
     * track the position of a moving contact
     */
    this.nameDeltaX = 0;
    this.nameDeltaY = 0;
    /*
     * track the position of a moving face
     */
    this.headDeltaX = 0;
    this.headDeltaY = 0;

		if( !Util.getHideSimpleTrainingPopup() ) {
			this.alert.simpleTrainingPopup();
		}
	/*
     * for the preview popup
     */
	
	if(Util.isIe6()){
		this.FF = false;
		this.ie6 = true;
		
	}else{
		this.FF = true;
		this.ie6 = false;
		
	}
	 
	
	this.tipFollowMouse= true;	
	this.tipWidth= 160;
	this.offX= 20;	
	this.offY= 12; 
	this.tooltip, this.tipcss;
	this.t1,this.t2;	
	this.tipOn = false;
	this.mouseX, this.mouseY;
}


SimpleTrainingController.prototype = new ActiveManualTraining;
/*
 * Initialize contacts, faces, and event handlers
 */
SimpleTrainingController.prototype.onload = function() {
	var previewLoader = this.initPreviewPopup();

	if( Util.isMac() ) {
		DOM.setInnerHTML( 'ctrlSelectButton', 'Q' );
	}
	
	if( Util.getHideUscConfirmation() ) {
		this.btnToggleMessage();
	}

		if( DOM.exists('noRoi') ) {
			var poll = new CyclePoll(1000, 3);
			poll.notDone = function() {
				DOM.setInnerHTML( 'ellipsis', DOM.getInnerHTML('ellipsis')+'.' );
			};
			poll.onDone = function() {
				location = '/usc';
			};
			poll.start();
			
			this.setClickedToExit(true);
		}
		if( Util.isIe6()) {
			document.getElementById('simpleTrainingSidebar').style.height = this.columnHeight+'px';
		}
    this.heads = DOM.getElementsByClassName( 'content', 'headImg' );
    for ( var i = 0; i < this.heads.length; i++ ) {
        DOM.addEventListener( this.heads[i], 'mousedown', this.dragDownHead );
    }
    this.names = this.getNameElements();
    for ( var i = 0; i < this.names.length; i++ ) {
        DOM.addEventListener( this.names[i], 'mousedown', this.dragDownName );
    }
    
    document.onkeydown = function(e) {
        var event = new Event(e);
        var keyCode = event.getKeyCode();
        
        if( Util.isMac() ) {
					if( keyCode == 81 ) {
							active.ctrlDown = true;
					}        
        } else {
					if( keyCode == 17 ) {
							active.ctrlDown = true;
					}
				}
    };
   
	document.onkeyup = function(e) {
        active.ctrlDown = false;
        var event = new Event(e);
        var target = event.getTarget();
        var keyCode = event.getKeyCode();
        var className = target.className;

				if( className == 'enterName' ) {
					if (keyCode < 32 || (keyCode >= 33 && keyCode <= 46) || (keyCode >= 112 && keyCode <= 123)) {
							
							if( keyCode == 8 || keyCode == 46 ) {
								DOM.setValue( target.id.split('__')[0]+'__email', '' );
							}
							
							// don't do anything if it's a special key
					}
				}
				

    };
    // IE-specific event handlers
    if( Util.isIe6()) {
        document.onmouseover = function(e) {
            if( active.headMouseDown ) {
                var event = new Event(e);
                if( event.getTarget().className == 'abook' ) {
                    active.jackpotName(e);
                } else {
                		// don't remember why this is here in the first place??
                		
                    // active.deactivateNameBuckets();
                }
            }
        };
        document.onmouseout = function(e) {
            if( active.headMouseDown ) {
                var event = new Event(e);
                if( event.getTarget().className == 'abook' ) {
                    active.missName(e);
                }
            }
        };
    }
    
    this.startAutoScroll();

		this.alert.closeXS();

		Util.poll();

	
};
//saj
SimpleTrainingController.prototype.nameValidator = '';
SimpleTrainingController.prototype.emailValidator = '';

SimpleTrainingController.prototype.startAutoScroll = function() {
    if( !this.interval ) {
    	this.interval = setInterval( function() { active.scrollAddress() }, 100 );
    }
};
SimpleTrainingController.prototype.stopAutoScroll = function() {
    clearInterval( this.interval );
    
    this.interval = 0;
};
SimpleTrainingController.prototype.scrollAddress = function() {
	var scrollTo = DOM.getContentScrollTo();
	
	var sidebarTop = scrollTo > 250 ? scrollTo : 250;
	
	document.getElementById('simpleTrainingSidebar').style.top = sidebarTop+'px';
};

SimpleTrainingController.prototype.tempNameValue = '';

/*
 * Clears the default text "Full Name" and "Email" when the user starts typing
 */
SimpleTrainingController.prototype.focusClearText = function(faceId) {
	universalHideDiv();
    if( DOM.getValue(faceId+'__name') == this.defaultName ) {
			DOM.setValue(faceId+'__email', '');
		}
    
    this.setEmailDisabled( faceId, false );
    
    var tb = document.getElementById(faceId+'__name');
    try {
    	tb.focus();
    } catch(e) {}

		if(tb.createTextRange) {
				var oRange = tb.createTextRange();
				oRange.moveStart("character", 0);
				oRange.moveEnd("character", this.defaultName.length);
				oRange.select();
		} else if (tb.setSelectionRange) {
				tb.setSelectionRange(0, this.defaultName.length);
		}

    try {
    	tb.focus();
    } catch(e) {}
};
/*
 * Clear the green border of a selected group of faces after identification
 */
SimpleTrainingController.prototype.clearBorder = function(div) {
    div.style.cssText = '';
};
/*
 * Set the green border of a face when it's selected
 */
SimpleTrainingController.prototype.setBorder = function(div) {
    div.style.border = '2px solid #67CE3D';
};
/*
 * Make the sidebar overflow visible when dragging;
 * if overflow is hidden, you won't be able to drag contacts out of it
 */ 
SimpleTrainingController.prototype.hideSidebar = function() {
    var div = document.getElementById('simpleTrainingSidebar');
    var scrollTop = div.scrollTop;
    DOM.setVisible( 'simpleTrainingAddBox', false );
    var norm = scrollTop - 120;
    var startIndex = Math.floor(norm / 24);
    var endIndex = startIndex + Math.floor(this.columnHeight / 24) + 1;	//+1 for bug 153
    if( norm >= 0 ) {
        for( var i=0; i < startIndex; i++ ) {
            DOM.setVisible( this.names[i], false );
        }
    }
    for( var i=endIndex+1; i < this.names.length; i++ ) {
        DOM.setVisible( this.names[i], false );
    }
    with( div.style ) {
        overflow = 'visible';
        marginTop = (-1*scrollTop)+'px';
    }
};
/*
 * Restore sidebar after done dragging
 */
SimpleTrainingController.prototype.showSidebar = function() {
    with( document.getElementById('simpleTrainingSidebar').style ) {
        overflow = 'auto';
        marginTop = '0px';
    }
    for( var i=0; i < this.names.length; i++ ) {
        DOM.setVisible( this.names[i], true );
    }
    DOM.setVisible( 'simpleTrainingAddBox', true );
};

/*
 * Onblur event handler for the email fields.  Update the contact's email
 * address when tabbing or mousing off; if the contact doesn't exist yet,
 * add it
 */
SimpleTrainingController.prototype.blurUpdateContact = function(faceId) {
	if( this.getEmailDisabled(faceId) ) {
		return;
	}

	var name = DOM.getValue(faceId+'__name');
	var email = DOM.getValue(faceId+'__email');
	SimpleTrainingController.prototype.emailValidator = email;

	var errorMsg = '';
	
	if( myAddressBook.names.contains(name) ) {
			errorMsg = this.updateContact( name, email );
	} else {
			errorMsg = this.addContact( name, email, true );
	}

	if( errorMsg ) {
		alert(errorMsg);

		DOM.setValue(faceId+'__email', '');    
	}

	this.setEmailDisabled( faceId, true );
};

/*
 * Onblur event handler for the name fields.  Add the contact to the address
 * book when tabbing or mousing off
 */
SimpleTrainingController.prototype.blurAddContact = function(faceId) {
	var name = active.tempNameValue;
	var email = DOM.getValue(faceId+'__email');
	if(name == "Don\'t Know"){
	email.readonly = true;
	}
	SimpleTrainingController.prototype.nameValidator = name;
    
	var errorMsg = this.addContact( name, email, true );
	if( errorMsg ) {
		alert(errorMsg);

		DOM.setValue(faceId+'__name', '');
		DOM.setValue(faceId+'__email', '');
	}
};

/*
 * 5/16/2006 event handler - add new contact section
 */
SimpleTrainingController.prototype.btnAddContact = function() {
    var name = DOM.getValue('newName');
    var email = DOM.getValue('newEmail');
    
    var errorMsg = this.addContact( name, email, false );
    
    if( errorMsg ) {
        alert(errorMsg);
    } else {
        DOM.setValue('newName', '');
        DOM.setValue('newEmail', '');
    }
};

/*
 * add an email to an existing contact w/ no email
 */
SimpleTrainingController.prototype.updateContact = function(name, email) {	
	if( myAddressBook.names.matches(name, email) ) {
		return '';
	}
	
	if( !email ) {
		return;
	}
	
	var errorMsg = Util.emailNotValid(email, name);
    
	if( !errorMsg ) {
		var result = myAddressBook.emails.insert(email, name);
		if( !result.success ) {
			errorMsg = email + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(email) + '\' from the list or type in a new email address.';		
		}
		
		var idx = myAddressBook.names.getInsertIndex(name)+2;
		
		myAddressBook.names.updateHash(name, email);
        
		if( idx >= 0 ) {
			this.names[idx].title = email;
			this.names[idx].id = email;
		}
	}
    
	return errorMsg;	
};

/*
 * Add a new contact to the address book
 */
SimpleTrainingController.prototype.addContact = function(name, email, weakValidation) {
	if( DOM.equalsIgnoreCase( name, this.defaultName ) || DOM.equalsIgnoreCase( name, 'Don\'t Know' ) || DOM.equalsIgnoreCase( name, 'Not A Face' ) ) {
		return;
	}

	var errorMsg = Util.addressNotValid(name, email, weakValidation);
	var errorMsgStrong = ( weakValidation ? Util.addressNotValid(name, email) : errorMsg );
    
	if( !errorMsgStrong ) {
		var abook = this.names[0].cloneNode(false);
		abook.innerHTML = name;
		abook.title = email;
		abook.id = email;
        
		// IE copies event listeners and Firefox doesn't
		if( !Util.isIe6()) {
			DOM.addEventListener( abook, "mousedown", this.dragDownName );
		}
		
		var result = myAddressBook.insert(name, email);
		
		if( !result.success ) {
			if( !result.nameSuccess && !weakValidation ) {
				errorMsg = name + ' is already in your Address Book.';
			} else if( !result.emailSuccess && !weakValidation ) {
				errorMsg = email + ' has already been assigned.  Please select \'' + myAddressBook.emails.getByHash(email) + '\' from the list or type in a new email address.';
			}
		} else {
			var index = result.index;
			
			if( index >= 0 ) {
					this.names[0].parentNode.insertBefore( abook, this.names[index+2] );
			} else {			
					this.names[0].parentNode.appendChild( abook );
			}
			
			this.names = this.getNameElements();
		}
	}
	
	return errorMsg;
};


/*
 * Hand-off the contact-drag event to the controller instance
 */
SimpleTrainingController.prototype.dragDownName = function(e) {
    active.tempNameValue = '';
	universalHideDiv();
	active.hidePreviewPopup();
	active._dragDownName(e);
	
};
/*
 * Hand-off the face-drag event to the controller instance
 */
SimpleTrainingController.prototype.dragDownHead = function(e) {
	active.tempNameValue = '';
	universalHideDiv();
	active.hidePreviewPopup();
    active._dragDownHead(e);
};
/*
 * Handle Address Book drag-and-drop
 */
SimpleTrainingController.prototype._dragDownName = function(e) {
	active.hidePreviewPopup();
    var event = new Event(e);
    
    this.currentAbook = event.getTarget();
    
    this.nameDeltaX = event.getX() - 25;
    this.nameDeltaY = event.getY() - 25;
    DOM.addEventListener( document, "mousemove", this.dragMoveName );    
    DOM.addEventListener( document, "mouseup", this.dragUpName );
    event.cancelBubble();
    this.activateHeadBuckets();
}
SimpleTrainingController.prototype.dragMoveName = function(e) {
	active.hidePreviewPopup();
    active._dragMoveName(e);
};
SimpleTrainingController.prototype._dragMoveName = function(e) {
	active.hidePreviewPopup();
    var event = new Event(e);
    var posX = event.getX() - this.nameDeltaX;
    var posY = event.getY() - this.nameDeltaY;

    with( this.currentAbook.style ) {
        left = posX + 'px';
        top = posY + 'px';
    }
    event.cancelBubble();
};
SimpleTrainingController.prototype.dragUpName = function(e) {
	active.hidePreviewPopup();
    active._dragUpName(e);
};
SimpleTrainingController.prototype._dragUpName = function(e) {
    var event = new Event(e);
    
    with( this.currentAbook.style ) {
        left = '0px';
        top = '0px';
    }
    DOM.removeEventListener(document,"mousemove", this.dragMoveName);
    DOM.removeEventListener(document,"mouseup", this.dragUpName);
    active.hidePreviewPopup();
    event.cancelBubble();
    if( this.currentHead ) {
        var name = this.currentAbook.innerHTML;
        var email = this.currentAbook.id;
        var inputs = this.currentHead.getElementsByTagName('input');
        inputs[0].value = name;
        inputs[1].value = email;
        if( this.headArr[this.currentHead.id] ) {
            for( i in this.headArr ) {
                var inputs = this.headArr[i].getElementsByTagName('input');
                inputs[0].value = name;
                inputs[1].value = email;
            }
            this.headArr = new Object();
        }
    }
    this.currentAbook = null;
    this.deactivateHeadBuckets();
};
/*
 * Handle face drag-and-drop
 */
SimpleTrainingController.prototype._dragDownHead = function(e) {

    this.headMouseDown = true;
    this.activateNameBuckets();
    var event = new Event(e);
    var target = DOM.getAncestorOfClass( event.getTarget(), 'head' );
    if( this.ctrlDown ) {
        this.headArr[target.id] = target;
    } else if( !this.headArr[target.id] ) {
        for( i in this.headArr ) {
            this.clearBorder( this.headArr[i] );
        }
        this.headArr = new Object();
        this.headArr[target.id] = target;
    }
    
		this.setBorder( target );
    this.headDeltaX = event.getX() - 5;
    this.headDeltaY = event.getY() - 5;
    DOM.addEventListener(document,"mousemove", this.dragMoveHead);
    DOM.addEventListener(document,"mouseup", this.dragUpHead);
    active.hidePreviewPopup();
    event.cancelBubble();
};
SimpleTrainingController.prototype.dragMoveHead = function(e) {
	active.hidePreviewPopup();
    active._dragMoveHead(e);
};
SimpleTrainingController.prototype._dragMoveHead = function(e) {
    for( var j=0; j < this.heads.length; j++ ) {
        var div = DOM.getAncestorOfClass( this.heads[j], 'head' );
        if( !this.headArr[div.id] ) {
            DOM.setOpacity( div, 0.05 );
        }
    }
    var event = new Event(e);
    var posX = event.getX() - this.headDeltaX;
    var posY = event.getY() - this.headDeltaY;

    for( i in this.headArr ) {
        with( this.headArr[i].style ) {
            left = posX + 'px';
            top = posY + 'px';
        }
    }
    event.cancelBubble();
};
SimpleTrainingController.prototype.dragUpHead = function(e) {
	active.hidePreviewPopup();
    active._dragUpHead(e);
};
SimpleTrainingController.prototype._dragUpHead = function(e) {
    this.headMouseDown = false;
    for( var j=0; j < this.heads.length; j++ ) {
        DOM.setOpacity( DOM.getAncestorOfClass( this.heads[j], 'head' ), 1.0 );
    }
    var event = new Event(e);
    for( i in this.headArr ) {
        with( this.headArr[i].style ) {
            left = '0px';
            top = '0px';
        }
        var inputs = this.headArr[i].getElementsByTagName('input');
        if( this.currentName ) {
            inputs[0].value = this.currentName;
            inputs[1].value = this.currentEmail;

						this.clearBorder( this.headArr[i] );
        }
    }
    this.currentName = '';
    this.currentEmail = '';
    DOM.removeEventListener(document,"mousemove", this.dragMoveHead);
    DOM.removeEventListener(document,"mouseup", this.dragUpHead);
    active.hidePreviewPopup();
    event.cancelBubble();
    this.deactivateNameBuckets();
};
/*
 * Activate the mouseover event handlers for the Address Book - when user
 * is dragging face(s)
 */
SimpleTrainingController.prototype.activateNameBuckets = function() {
    active.hidePreviewPopup();
	this.hideSidebar();
    for ( var i = 0; i < this.names.length; i++ ) {
        DOM.addEventListener( this.names[i], "mouseover", this.jackpotName );
        DOM.addEventListener( this.names[i], "mouseout", this.missName );
    }
};
/*
 * Activate the mouseover event handlers for the faces - when user is
 * dragging a contact
 */
SimpleTrainingController.prototype.activateHeadBuckets = function() {
    active.hidePreviewPopup();
	this.hideSidebar();
    for ( var i = 0; i < this.heads.length; i++ ) {
        DOM.addEventListener( this.heads[i], "mouseover", this.jackpotHead );
        DOM.addEventListener( this.heads[i], "mouseout", this.missHead );
    }
};
/*
 * Deactivate the handlers for the faces - when user is done dragging a contact
 */
SimpleTrainingController.prototype.deactivateHeadBuckets = function() {
	active.hidePreviewPopup();
    this.showSidebar();
    for ( var i = 0; i < this.heads.length; i++ ) {
        var div = DOM.getAncestorOfClass( this.heads[i], 'head' );
        this.clearBorder( div );
        DOM.setOpacity( div, 1.0 );
        DOM.removeEventListener( this.heads[i], "mouseover", this.jackpotHead );
        DOM.removeEventListener( this.heads[i], "mouseout", this.missHead );
    }
};
/*
 * Deactivate the handlers for the Address Book - when user is dragging face(s)
 */
SimpleTrainingController.prototype.deactivateNameBuckets = function() {
	active.hidePreviewPopup();
    this.showSidebar();
    for ( var i = 0; i < this.names.length; i++ ) {
        this.clearBorder( this.names[i] );
        DOM.setOpacity( this.names[i], 1.0 );
        DOM.removeEventListener( this.names[i], "mouseover", this.jackpotName);
        DOM.removeEventListener( this.names[i], "mouseout", this.missName);
    }
};
/*
 * Hand-off the face mouseover event to the controller instance
 */
SimpleTrainingController.prototype.jackpotHead = function(e) {
    active.hidePreviewPopup();
	active._jackpotHead(e);
};
/*
 * Handle dragging a contact name onto face(s)
 */
SimpleTrainingController.prototype._jackpotHead = function(e) {
    var event = new Event(e);
    var target = event.getTarget();
    this.setBorder(DOM.getAncestorOfClass( target, 'head' ));
    var isClustered = false;
    for ( var j = 0; j < this.heads.length; j++ ) {
        var div = DOM.getAncestorOfClass( this.heads[j], 'head' );
        if( this.heads[j] == DOM.getAncestorOfClass( target, 'headImg' ) ) {
            DOM.setOpacity( div, 1.0 );
            if( this.headArr[div.id] ) {
                isClustered = true;
            }
        } else {
            DOM.setOpacity( div, 0.2 );
        }
    }
    if( isClustered ) {
        for( i in this.headArr ) {
            DOM.setOpacity( this.headArr[i], 1.0 );
        }
    }
    this.currentHead = DOM.getAncestorOfClass( target, 'head' );
};
/*
 * Hand-off the face mouseout event to the controller instance
 */
SimpleTrainingController.prototype.missHead = function(e) {
   active.hidePreviewPopup();
	active._missHead(e);
};
/*
 * Handle dragging a contact name off face(s)
 */
SimpleTrainingController.prototype._missHead = function(e) {
    var event = new Event(e);
    var div = DOM.getAncestorOfClass( event.getTarget(), 'head' );
    if( !this.headArr[div.id] ) {
        this.clearBorder(div);
    }
};
/*
 * Hand-off the Address Book mouseover event to the controller instance
 */
SimpleTrainingController.prototype.jackpotName = function(e) {
    active.hidePreviewPopup();
	active._jackpotName(e);
};
/*
 * Handle dragging face(s) onto a contact name
 */
SimpleTrainingController.prototype._jackpotName = function(e) {
    var event = new Event(e);
    var target = event.getTarget();
    this.setBorder(target);
    for ( var i = 0; i < this.names.length; i++ ) {
        if( this.names[i] == target ) {
            DOM.setOpacity( this.names[i], 1.0 );
        } else {
            DOM.setOpacity( this.names[i], 0.2 );
        }
    }
    this.currentName = target.innerHTML;
    this.currentEmail = target.id;
};
/*
 * Hand-off the Address Book mouseout event to the controller instance
 */
SimpleTrainingController.prototype.missName = function(e) {
    active.hidePreviewPopup();
	active._missName(e);
};
/*
 * Handle dragging face(s) off a contact name
 */
SimpleTrainingController.prototype._missName = function(e) {
    var event = new Event(e);
    this.clearBorder(event.getTarget());
    this.currentName = '';
    this.currentEmail = '';
};

SimpleTrainingController.prototype.initPreviewPopup = function(){
	this.ie6Up = this.ie6 ;
	this.tooltip = (this.ie6Up||this.FF)? document.getElementById('previewDiv'): null;
	if (this.tooltip){
		this.tipcss =  this.tooltip.style;
	}	
	if (this.tooltip&&this.tipFollowMouse) {
	document.onmousemove = this.trackMouse;
	}
	
}


SimpleTrainingController.prototype.trackMouse = function(evt){
	active.mouseX = (active.FF)? evt.pageX: window.event.clientX + document.body.scrollLeft;
	active.mouseY = (active.FF)? evt.pageY: window.event.clientY + document.body.scrollTop;
	if (active.tipOn) active.positionTip(evt);
}

SimpleTrainingController.prototype.positionTip = function(evt){
	this.ie6Up = this.ie6 ;
	if (!this.tipFollowMouse) {
		
		this.mouseX = (this.FF)? evt.pageX: window.event.clientX + document.body.scrollLeft;
		this.mouseY = (this.FF)? evt.pageY: window.event.clientY + document.body.scrollTop;
	}
	var tpWd = (this.ie6Up)? this.tooltip.clientWidth: this.tooltip.offsetWidth;
	var tpHt = (this.ie6Up)? this.tooltip.clientHeight: this.tooltip.offsetHeight;
	var winWd = (this.FF)? window.innerWidth-20+window.pageXOffset: document.body.clientWidth+document.body.scrollLeft;
	var winHt = (this.FF)? window.innerHeight-20+window.pageYOffset: document.body.clientHeight+document.body.scrollTop;
	if ((this.mouseX+this.offX+tpWd)>winWd) 
		this.tipcss.left = this.mouseX-(tpWd+this.offX)+"px";
	else this.tipcss.left = this.mouseX+this.offX+"px";
	if(this.ie6 ){
	if ((this.mouseY+this.offY+tpHt)>winHt) {
			var bb = (eval(winHt-(tpHt+this.offY))) ;
			var aa = this.mouseY+this.offY;
			aa = winHt-aa+410;
			this.tipcss.top = aa+"px";
		} else{
			var aa = this.mouseY+this.offY;
			aa = eval(aa);
			this.tipcss.top = aa+"px";
		}
	}else{
		if ((this.mouseY+this.offY+tpHt)>winHt) 
			this.tipcss.top = winHt-(tpHt+this.offY)+"px";
		else this.tipcss.top = this.mouseY+this.offY+"px";	
	}
	if (!this.tipFollowMouse) t1=setTimeout("this.tipcss.visibility='visible'",100);

}
SimpleTrainingController.prototype.changeMode = function(){
	var a = document.getElementById("previewMode");
	var b = document.getElementById("previewText");
	if (a.value == "ON")
	{
		a.value = "OFF"
		b.innerHTML = "Turn On"
	}else{
		a.value = "ON"
		b.innerHTML = "Turn Off"
	}

}

SimpleTrainingController.prototype.showPreviewPopup = function(evt,url,overlayId){
	universalHideDiv();
	var a = $("previewMode");
	if (a.value == "OFF"){
		return;
	}else{
		$(overlayId).style.visibility='hidden';
		if (!this.tooltip) return;
		if (this.t1) clearTimeout(this.t1);	if (this.t2) clearTimeout(this.t2);
		this.tipOn = true;	
		var previewSnap = url.split(".jpg_")
		var tip = "<div style=\"background-color:#CCCCCC;height:300px;width:410px;text-align:center;padding-top:5px;padding-bottom:5px;\"><img src=\""+previewSnap[0]+".jpg_screenres\" width=\"400\" height=\"300\"/></div>"
		this.tooltip.innerHTML = tip;
		if (!this.tipFollowMouse) this.positionTip(evt);
		else this.t1=setTimeout("active.tipcss.visibility='visible'",100);
	}
}

SimpleTrainingController.prototype.hidePreviewPopup = function(overlayId){
	if(overlayId){
		$(overlayId).style.visibility='visible';
	}	
	if (!this.tooltip) return;
	this.t2=setTimeout("active.tipcss.visibility='hidden'",100);
	this.tipOn = false;
}


SimpleTrainingController.prototype.btnToggleMessage = function(e) {
	var msg = DOM.getInnerHTML('simpleTrainingMessageHideHref');
	
	if( msg == this.HIDE_MESSAGE ) {
		Util.setHideUscConfirmation();
	
		DOM.setInnerHTML( 'simpleTrainingMessageHideHref', this.SHOW_MESSAGE );
		
		DOM.hide( 'simpleTrainingMessage' );
	} else {
		Util.clearHideUscConfirmation();
	
		DOM.setInnerHTML( 'simpleTrainingMessageHideHref', this.HIDE_MESSAGE );
		
		DOM.show( 'simpleTrainingMessage' );
	}
};

SimpleTrainingController.prototype.getScrollIncrement = function(posY, currPosY) {
	return (posY - currPosY)*0.75;
};

SimpleTrainingController.prototype.getEmailDisabled = function( faceId ) {
	return document.getElementById(faceId+'__email').readOnly;
};

SimpleTrainingController.prototype.setEmailDisabled = function( faceId, bool ) {
	document.getElementById(faceId+'__email').readOnly = bool;
};

/*
 * Add 2 to account for Don't Know and Not A Face entry
 */
SimpleTrainingController.prototype.getNameIdx = function( name ) {
	return Util.getNameIdx(name)+2;
};
SimpleTrainingController.prototype.getNameElements = function() {
	return DOM.getElementsByClassName( 'content', 'abook' );
};

SimpleTrainingController.prototype.getRiyaSuggest = function(newName){
	new AutoSuggest(newName, myAddressBook.names);
}



function ImportContactController() {
this.googleImported = 'false';
this.hotmailImported = 'false';
this.yahooImported = 'false';

}

ImportContactController.prototype = new Active;

ImportContactController.prototype.btnSearch = function() {
	var fullName = DOM.getValue('fullName');
	
	if( fullName ) {
		this.btnInherit( fullName, '' );
		
		DOM.setValue( 'fullName', '' );
	}
};

ImportContactController.prototype.btnInherit = function(name, email) {
	this.alert.inherit(name, email);
};

ImportContactController.prototype.btnSubmitInherit = function( ) {
	var acceptedList = '';
	var name = '';
	var inputs = this.alert.getContentXL().getElementsByTagName("input");
	for( var i=0; i < inputs.length; i++ ) {
		if( inputs[i].checked ) {
			acceptedList += inputs[i].id + ',';
			name += DOM.getValue(inputs[i].id+'__name') +',';
		}
	}
	
	ajaxHandler.mergeTrainingSets( name, acceptedList, DOM.getValue('identifiedUserName'));

	this.alert.closeXL();

	Util.startRecognizedAnimation();
	
	location = '/simpleTraining';
};

ImportContactController.prototype.importContacts = function() {
	
	DOM.show(document.getElementById('importContacts'));
	var googleUserName = DOM.getValue('googleUserName');
	var googlePassword = DOM.getValue('googlePassword');
	var yahooUserName = DOM.getValue('yahooUserName');
	var yahooPassword = DOM.getValue('yahooPassword');
	var hotmailUserName = DOM.getValue('hotmailUserName');
	var hotmailPassword = DOM.getValue('hotmailPassword');
	var checkerGmail = false;
	var checkerYahoo = false;
        if(googleUserName && !googlePassword){
          alert("Please enter your GMail Password");
          return false;
        }
        if(hotmailUserName && !hotmailPassword){
          alert("Please enter your Hotmail Password");
          return false;
        }
        if(yahooUserName && !yahooPassword){
          alert("Please enter your Yahoo Password");
          return false;
        }

		if(document.getElementById('check_yahoo').checked){
			checkerYahoo = true;
		}
		if(document.getElementById('check_gmail').checked){
			checkerGmail = true;
		}
        
	if(googleUserName && checkerGmail){
         DOM.show(document.getElementById('gmailStatus'));
	}
        else
        {
          DOM.hide(document.getElementById('gmailStatus'));
        }
        if(yahooUserName && checkerYahoo){
          DOM.show(document.getElementById('yahooStatus'));         
	}
        else
        {
          DOM.hide(document.getElementById('yahooStatus'));         
	}
        if(hotmailUserName){
          DOM.show(document.getElementById('hotmailStatus'));
	}
        else
        {
          DOM.hide(document.getElementById('hotmailStatus'));
        }
        if(googleUserName){
         active.importAndShowContacts(googleUserName,googlePassword,1);
	}
        if(yahooUserName){
          active.importAndShowContacts(yahooUserName,yahooPassword,2);  	        
	}
        if(hotmailUserName){
          active.importAndShowContacts(hotmailUserName,hotmailPassword,3);  
	}
	if(!(googleUserName || yahooUserName || hotmailUserName))
	{
		alert('Please enter details for at least one account.');
	}
};

  ImportContactController.prototype.show = function(id) {
	DOM.toggleDisplay(id);
};


ImportContactController.prototype.importAndShowContacts = function(userName, password, emailType) {
  var url = AjaxHandler.WWW_AJAX_URL + 'action=importContacts';
  url += '&username=' + userName + '&password='+ password + '&emailType=' + emailType;
  this.alert._alertXL("Import Contacts");
  active.alert._setContent('XL',document.getElementById("importOuter").innerHTML);
  DOM.setVisible("importedContacts",true);
  
  var xmlHttp = DOM.getXmlHttp();
  xmlHttp.onreadystatechange = function() 
  {
    if (xmlHttp.readyState == 4) 
    {
      if (xmlHttp.status == 200)
      {
        var contactString = xmlHttp.responseText;
        active.updateContacts(contactString,emailType);
      }
    }
  }

  xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
  xmlHttp.send(null);
};

ImportContactController.prototype.showImportAlert = function(){
  var xmlHttp = DOM.getXmlHttp();
  alert("1");
  xmlHttp.onreadystatechange = function() 
  {
    if (xmlHttp.readyState == 4) 
    {
      if (xmlHttp.status == 200)
      {
          alert("Got the response");
        this.alert._alertXL("Import Contacts");
        alert(xmlHttp.responseText);
        active.alert._setContent('XL',xmlHttp.responseText);
      }
    }
  }

  xmlHttp.open("GET", Util.getNoCacheUrl("/importContactContent"), true);
  xmlHttp.send(null);
  
};
ImportContactController.prototype.addToAddressBook = function() {
  var contactString = '';
  var contactVS = document.getElementById('contactsWithVS');
  var contacts = DOM.getElementsByClassName(contactVS,"vsContact");
  if(contacts &&(!contacts.length)){
   if(contacts.checked)
      contactString += contacts.value + ","; 
  }
  else if(contacts && contacts.length)
  {
    for(var i=0;i<contacts.length;i++){
            if(contacts[i].checked){
                    contactString += contacts[i].value + ",";
            }
    }
  }
  if(contactString == ''){
    alert('No contacts to save');
    active.alert.closeXL();
    return;
  }
  var url = AjaxHandler.WWW_AJAX_URL + 'action=saveExternalContacts&contactId=' + contactString;
  
  var xmlHttp = DOM.getXmlHttp();
  xmlHttp.onreadystatechange = function() 
  {
    if (xmlHttp.readyState == 4) 
    {
      if (xmlHttp.status == 200)
      {
        alert('Contacts saved to your Address Book');
		location = '/simpleTraining';
		active.alert.closeXL();
      }
    }
  }

  xmlHttp.open("GET", Util.getNoCacheUrl(url), true);
  xmlHttp.send(null);
	

}

ImportContactController.prototype.updateContacts = function(contactString,emailType) 
{
  var contactSelect = document.getElementById('importedContacts');
  var contactVS = document.getElementById('contactsWithVS');
  var contacts = contactString.split(',');
  var contactOption = document.getElementById("contactOption");
  for(var i=0;i<contacts.length;i++)
  {
    var contact = contacts[i];
    var contactTokens = contact.split(gDelimiter);
    var contactId = contactTokens[0];
    var contactEmail = contactTokens[1];
    if(contactId && contactEmail)
    {
      var visualSign = contactTokens[2];
      var alreadyPresent = contactTokens[3];
      var el = document.createElement("OPTION");
      el.innerHTML = contactEmail;	
      el.value = contactId;
      contactSelect.appendChild(el);
      if(visualSign=='true' && (alreadyPresent != 'true'))
      {
        var vs = document.getElementById("vs").cloneNode(false);
        var cb = document.getElementById("check").cloneNode(false);
        var nameText = document.getElementById("nameText").cloneNode(false);
        var el1 = document.createElement("input");
        el1.type = "checkbox";
        el1.name = "checkbox_contact";
        el1.id = "checkbox_contact";
        el1.value = contactId;
        el1.checked = "true";
        el1.className = "vsContact";
        nameText.innerHTML = contactEmail;
        cb.appendChild(el1);
        vs.appendChild(cb);
        vs.appendChild(nameText);
        contactVS.appendChild(vs);
      }
    }
  }
  this.changeStatus(emailType);
};
ImportContactController.prototype.changeStatus = function(emailType) {
  if(emailType==1){
    var statusDiv = document.getElementById("gmailStatus");
    statusDiv.innerHTML = "Finished importing Gmail Address Book";
  }
  else if(emailType==2){
    var statusDiv = document.getElementById("yahooStatus");
    statusDiv.innerHTML = "Finished importing Yahoo Address Book";
  }
  else if(emailType==3){
    var statusDiv = document.getElementById("hotmailStatus");
    statusDiv.innerHTML = "Finished importing Hotmail Address Book";
  }
  
}
//-- Urchin Tracking Module 6.3 (UTM 6.3) $Revision: 1.1 $
//-- Copyright 2005 Urchin Software Corporation, All Rights Reserved.

//-- Urchin On Demand Settings ONLY
var _uacct="UA-31995-1";	// set up the Urchin Account Number
var _userv=1;			// service mode (0=local,1=remote,2=both)

//-- UTM User Settings
var _ufsc=1;			// set client info flag (1=on|0=off)
var _udn="auto";		// (auto|none|domain) set the domain name for cookies
var _uhash="on";		// (on|off) unique domain hash for cookies
var _utimeout="1800";   	// set the inactive session timeout in seconds
var _ugifpath="/__utm.gif";	// set the web path to the __utm.gif file
var _utsp="|";			// transaction field separator
var _uflash=1;			// set flash version detect option (1=on|0=off)
var _utitle=1;			// set the document title detect option (1=on|0=off)
var _ulink=0;			// enable linker functionality (1=on|0=off)

//-- UTM Campaign Tracking Settings
var _uctm=1;			// set campaign tracking module (1=on|0=off)
var _ucto="15768000";		// set timeout in seconds (6 month default)
var _uccn="utm_campaign";	// name
var _ucmd="utm_medium";		// medium (cpc|cpm|link|email|organic)
var _ucsr="utm_source";		// source
var _uctr="utm_term";		// term/keyword
var _ucct="utm_content";	// content
var _ucid="utm_id";		// id number
var _ucno="utm_nooverride";	// don't override

//-- Auto/Organic Sources and Keywords
var _uOsr=new Array();
var _uOkw=new Array();
_uOsr[0]="google";	_uOkw[0]="q";
_uOsr[1]="yahoo";	_uOkw[1]="p";
_uOsr[2]="msn";		_uOkw[2]="q";
_uOsr[3]="aol";		_uOkw[3]="query";
_uOsr[4]="lycos";	_uOkw[4]="query";
_uOsr[5]="ask";		_uOkw[5]="q";
_uOsr[6]="altavista";	_uOkw[6]="q";
_uOsr[7]="search";	_uOkw[7]="q";
_uOsr[8]="netscape";	_uOkw[8]="query";
_uOsr[9]="earthlink";	_uOkw[9]="q";
_uOsr[10]="cnn";	_uOkw[10]="query";
_uOsr[11]="looksmart";	_uOkw[11]="key";
_uOsr[12]="about";	_uOkw[12]="terms";
_uOsr[13]="excite";	_uOkw[13]="qkw";
_uOsr[14]="mamma";	_uOkw[14]="query";
_uOsr[15]="alltheweb";	_uOkw[15]="q";
_uOsr[16]="gigablast";	_uOkw[16]="q";
_uOsr[17]="voila";	_uOkw[17]="kw";
_uOsr[18]="virgilio";	_uOkw[18]="qs";
_uOsr[19]="teoma";	_uOkw[19]="q";

//-- Auto/Organic Keywords to Ignore
var _uOno=new Array();
//_uOno[0]="urchin";
//_uOno[1]="urchin.com";
//_uOno[2]="www.urchin.com";
//_uOno[3]="secure.urchin.com";

//-- Referral domains to Ignore
var _uRno=new Array();
//_uRno[0]=".urchin.com";

//-- **** Don't modify below this point ***
var _uff,_udh,_udt,_ubl=0,_udo="",_uu,_ufns=0,_uns=0,_ur="-",_ufno=0,_ust=0,_ujv="-",_ubd=document,_udl=_ubd.location,_utcp="/",_uwv="6.3";
var _ugifpath2="http://service.urchin.com/__utm.gif";
if (_udl.protocol=="https:") _ugifpath2="https://service.urchin.com/__utm.gif";
if (!_utcp || _utcp=="") _utcp="/";
function urchinTracker(page) {
 if (_udl.protocol=="file:") return;
 if (_uff && (!page || page=="")) return;
 var a,b,c,v,z,k,x="",s="",f=0;
 var nx=" expires=Sun, 18 Jan 2038 00:00:00 GMT;";
 var dc=_ubd.cookie;
 _udh=_uDomain();
 _uu=Math.round(Math.random()*2147483647);
 _udt=new Date();
 _ust=Math.round(_udt.getTime()/1000);
 a=dc.indexOf("__utma="+_udh);
 b=dc.indexOf("__utmb="+_udh);
 c=dc.indexOf("__utmc="+_udh);
 if (_udn && _udn!="") { _udo=" domain="+_udn+";"; }
 if (_utimeout && _utimeout!="") {
  x=new Date(_udt.getTime()+(_utimeout*1000));
  x=" expires="+x.toGMTString()+";";
 }
 if (_ulink) {
  s=_udl.search;
  if(s && s!="" && s.indexOf("__utma=")>=0) {
   if (!(_uIN(a=_uGC(s,"__utma=","&")))) a="-";
   if (!(_uIN(b=_uGC(s,"__utmb=","&")))) b="-";
   if (!(_uIN(c=_uGC(s,"__utmc=","&")))) c="-";
   v=_uGC(s,"__utmv=","&");
   z=_uGC(s,"__utmz=","&");
   k=_uGC(s,"__utmk=","&");
   if ((k*1) != ((_uHash(a+b+c+z+v)*1)+(_udh*1))) {_ubl=1;a="-";b="-";c="-";z="-";v="-";}
   if (a!="-" && b!="-" && c!="-") f=1;
   else if(a!="-") f=2;
  }
 }
 if(f==1) {
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+c+"; path="+_utcp+";"+_udo;
 } else if (f==2) {
  a=_uFixA(s,"&",_ust);
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
  _ufns=1;
 } else if (a>=0 && b>=0 && c>=0) {
  _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
 } else {
  if (a>=0) a=_uFixA(_ubd.cookie,";",_ust);
  else a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1";
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
  _ufns=1;
 }
 if (_ulink && v && v!="" && v!="-") {
  v=unescape(v);
  if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo;
 }
 _uInfo(page);
 _ufns=0;
 _ufno=0;
 _uff=1;
}
urchinTracker();
function _uInfo(page) {
 var p,s="",pg=_udl.pathname+_udl.search;
 if (page && page!="") pg=escape(page);
 _ur=_ubd.referrer;
 if (!_ur || _ur=="") { _ur="-"; }
 else {
  p=_ur.indexOf(_ubd.domain);
  if ((p>=0) && (p<=8)) { _ur="0"; }
  if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; }
 }
 s+="&utmn="+_uu;
 if (_ufsc) s+=_uBInfo(page);
 if (_uctm && (!page || page=="")) s+=_uCInfo();
 if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+escape(_ubd.title);
 if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+escape(_udl.hostname);
 if (!page || page=="") s+="&utmr="+_ur;
 s+="&utmp="+pg;
 if (_userv==0 || _userv==2) {
  var i=new Image(1,1);
  i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
  i.onload=function() {_uVoid();}
 }
 if (_userv==1 || _userv==2) {
  var i2=new Image(1,1);
  i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
  i2.onload=function() { _uVoid(); }
 }
 return;
}
function _uVoid() { return; }
function _uCInfo() {
 if (!_ucto || _ucto=="") { _ucto="15768000"; }
 var c="",t="-",t2="-",o=0,cs=0,cn=0;i=0;z="-";
 var s=_udl.search;
 var x=new Date(_udt.getTime()+(_ucto*1000));
 var dc=_ubd.cookie;
 x=" expires="+x.toGMTString()+";";
 if (_ulink && !_ubl) {
  z=unescape(_uGC(s,"__utmz=","&"));
  if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; }
 }
 z=dc.indexOf("__utmz="+_udh);
 if (z>-1) { z=_uGC(dc,"__utmz="+_udh,";"); }
 else { z="-"; }
 t=_uGC(s,_ucid+"=","&");
 t2=_uGC(s,_ucsr+"=","&");
 if ((t!="-" && t!="") || (t2!="-" && t2!="")) {
  if (t!="-" && t!="") { c+="utmcid="+_uEC(t); if (t2!="-" && t2!="") c+="|utmcsr="+_uEC(t2);
  } else { if (t2!="-" && t2!="") c+="utmcsr="+_uEC(t2); }
  t=_uGC(s,_uccn+"=","&");
  if (t!="-" && t!="") c+="|utmccn="+_uEC(t);
  else c+="|utmccn=(not+set)";
  t=_uGC(s,_ucmd+"=","&");
  if (t!="-" && t!="") c+="|utmcmd="+_uEC(t);
  else  c+="|utmcmd=(not+set)";
  t=_uGC(s,_uctr+"=","&");
  if (t!="-" && t!="") c+="|utmctr="+_uEC(t);
  else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); }
  t=_uGC(s,_ucct+"=","&");
  if (t!="-" && t!="") c+="|utmcct="+_uEC(t);
  t=_uGC(s,_ucno+"=","&");
  if (t=="1") o=1;
  if (z!="-" && o==1) return "";
 }
 if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1)  return ""; }
 if (c=="-" || c=="") { if (_ufns==1)  c=_uRef(); if (z!="-" && _ufno==1)  return ""; }
 if (c=="-" || c=="") {
  if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; }
  if (c=="-" || c=="") return "";
 }
 if (z!="-") {
  i=z.indexOf(".");
  if (i>-1) i=z.indexOf(".",i+1);
  if (i>-1) i=z.indexOf(".",i+1);
  if (i>-1) i=z.indexOf(".",i+1);
  t=z.substring(i+1,z.length);
  if (t.toLowerCase()==c.toLowerCase()) cs=1;
  t=z.substring(0,i);
  if ((i=t.lastIndexOf(".")) > -1) {
   t=t.substring(i+1,t.length);
   cn=(t*1);
  }
 }
 if (cs==0 || _ufns==1) {
  t=_uGC(dc,"__utma="+_udh,";");
  if ((i=t.lastIndexOf(".")) > 9) {
   _uns=t.substring(i+1,t.length);
   _uns=(_uns*1);
  }
  cn++;
  if (_uns==0) _uns=1;
  _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo;
 }
 if (cs==0 || _ufns==1) return "&utmcn=1";
 else return "&utmcr=1";
}
function _uRef() {
 if (_ur=="0" || _ur=="" || _ur=="-") return "";
 var i=0,h,k,n;
 if ((i=_ur.indexOf("://"))<0) return "";
 h=_ur.substring(i+3,_ur.length);
 if (h.indexOf("/") > -1) {
  k=h.substring(h.indexOf("/"),h.length);
  if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?"));
  h=h.substring(0,h.indexOf("/"));
 }
 h=h.toLowerCase();
 n=h;
 if ((i=n.indexOf(":")) > -1) n=n.substring(0,i);
 for (var ii=0;ii<_uRno.length;ii++) {
  if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; }
 }
 if (h.indexOf("www.")==0) h=h.substring(4,h.length);
 return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral";
}
function _uOrg(t) {
 if (_ur=="0" || _ur=="" || _ur=="-") return "";
 var i=0,h,k;
 if ((i=_ur.indexOf("://")) < 0) return "";
 h=_ur.substring(i+3,_ur.length);
 if (h.indexOf("/") > -1) {
  h=h.substring(0,h.indexOf("/"));
 }
 for (var ii=0;ii<_uOsr.length;ii++) {
  if (h.indexOf(_uOsr[ii]) > -1) {
   if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) {
    k=_ur.substring(i+_uOkw[ii].length+2,_ur.length);
    if ((i=k.indexOf("&")) > -1) k=k.substring(0,i);
    for (var yy=0;yy<_uOno.length;yy++) {
     if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; }
    }
    if (t) return _uEC(k);
    else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic";
   }
  }
 }
 return "";
}
function _uBInfo(page) {
 var sr="-",sc="-",ul="-",fl="-",je=1;
 var n=navigator;
 if (self.screen) {
  sr=screen.width+"x"+screen.height;
  sc=screen.colorDepth+"-bit";
 } else if (self.java) {
  var j=java.awt.Toolkit.getDefaultToolkit();
  var s=j.getScreenSize();
  sr=s.width+"x"+s.height;
 }
 if (_ujv=="-" && (!page || page=="")) {
  for (var i=5;i>=0;i--) {
   var t="<script language='JavaScript1."+i+"'>_ujv='1."+i+"';</script>";
   _ubd.write(t);
   if (_ujv!="-") break;
  }
 }
 if (n.language) { ul=n.language.toLowerCase(); }
 else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); }
 je=n.javaEnabled()?1:0;
 if (_uflash) fl=_uFlash();
 return "&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmjv="+_ujv+"&utmfl="+fl;
}
function __utmSetTrans() {
 var e;
 if (_ubd.getElementById) e=_ubd.getElementById("utmtrans");
 else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans;
 if (!e) return;
 var l=e.value.split("UTM:");
 var i,i2,c;
 if (_userv==0 || _userv==2) i=new Array();
 if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); }

 for (var ii=0;ii<l.length;ii++) {
  l[ii]=_uTrim(l[ii]);
  if (l[ii].charAt(0)!='T' && l[ii].charAt(0)!='I') continue;
  var r=Math.round(Math.random()*2147483647);
  if (!_utsp || _utsp=="") _utsp="|";
  var f=l[ii].split(_utsp),s="";
  if (f[0].charAt(0)=='T') {
   s="&utmt=tran"+"&utmn="+r;
   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+escape(f[1]);
   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmtst="+escape(f[2]);
   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmtto="+escape(f[3]);
   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmttx="+escape(f[4]);
   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmtsp="+escape(f[5]);
   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmtci="+escape(f[6]);
   f[7]=_uTrim(f[7]); if(f[7]&&f[7]!="") s+="&utmtrg="+escape(f[7]);
   f[8]=_uTrim(f[8]); if(f[8]&&f[8]!="") s+="&utmtco="+escape(f[8]);
  } else {
   s="&utmt=item"+"&utmn="+r;
   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+escape(f[1]);
   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmipc="+escape(f[2]);
   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmipn="+escape(f[3]);
   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmiva="+escape(f[4]);
   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmipr="+escape(f[5]);
   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmiqt="+escape(f[6]);
  }
  if (_userv==0 || _userv==2) {
   i[ii]=new Image(1,1);
   i[ii].src=_ugifpath+"?"+"utmwv="+_uwv+s;
   i[ii].onload=function() { _uVoid(); }
  }
  if (_userv==1 || _userv==2) {
   i2[ii]=new Image(1,1);
   i2[ii].src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+c;
   i2[ii].onload=function() { _uVoid(); }
  }
 }
 return;
}
function _uFlash() {
 var f="-",n=navigator;
 if (n.plugins && n.plugins.length) {
  for (var ii=0;ii<n.plugins.length;ii++) {
   if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {
    f=n.plugins[ii].description.split('Shockwave Flash ')[1];
    break;
   }
  }
 } else if (window.ActiveXObject) {
  for (var ii=10;ii>=2;ii--) {
   try {
    var fl=eval("new ActiveXObject('ShockwaveFlash.ShockwaveFlash."+ii+"');");
    if (fl) { f=ii + '.0'; break; }
   }
   catch(e) {}
  }
 }
 return f;
}
function __utmLinker(l) {
 if (!_ulink) return;
 var p,k,a="-",b="-",c="-",z="-",v="-";
 var dc=_ubd.cookie;
 if (l && l!="") {
  if (dc) {
   a=escape(_uGC(dc,"__utma="+_udh,";"));
   b=escape(_uGC(dc,"__utmb="+_udh,";"));
   c=escape(_uGC(dc,"__utmc="+_udh,";"));
   z=escape(_uGC(dc,"__utmz="+_udh,";"));
   v=escape(_uGC(dc,"__utmv="+_udh,";"));
   k=(_uHash(a+b+c+z+v)*1)+(_udh*1);
   p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k;
  }
  if (p) {
   if (l.indexOf("?")<=-1) { document.location=l+"?"+p; }
   else { document.location=l+"&"+p; }
  } else { document.location=l; }
 }
}
function __utmLinkPost(f) {
 if (!_ulink) return;
 var p,k,a="-",b="-",c="-",z="-",v="-";
 var dc=_ubd.cookie;
 if (!f || !f.action) return;
 if (dc) {
  a=escape(_uGC(dc,"__utma="+_udh,";"));
  b=escape(_uGC(dc,"__utmb="+_udh,";"));
  c=escape(_uGC(dc,"__utmc="+_udh,";"));
  z=escape(_uGC(dc,"__utmz="+_udh,";"));
  v=escape(_uGC(dc,"__utmv="+_udh,";"));
  k=(_uHash(a+b+c+z+v)*1)+(_udh*1);
  p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k;
 }
 if (p) {
  if (f.action.indexOf("?")<=-1) f.action+="?"+p;
  else f.action+="&"+p;
 }
 return;
}
function __utmSetVar(v) {
 if (!v || v=="") return;
 var r=Math.round(Math.random() * 2147483647);
 _ubd.cookie="__utmv="+_udh+"."+escape(v)+"; path="+_utcp+"; expires=Sun, 18 Jan 2038 00:00:00 GMT;"+_udo;
 var s="&utmt=var&utmn="+r;
 if (_userv==0 || _userv==2) {
  var i=new Image(1,1);
  i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
  i.onload=function() { _uVoid(); }
 }
 if (_userv==1 || _userv==2) {
  var i2=new Image(1,1);
  i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
  i2.onload=function() { _uVoid(); }
 }
}
function _uGCS() {
 var t,c="",dc=_ubd.cookie;
 if ((t=_uGC(dc,"__utma="+_udh,";"))!="-") c+=escape("__utma="+t+";+");
 if ((t=_uGC(dc,"__utmb="+_udh,";"))!="-") c+=escape("__utmb="+t+";+");
 if ((t=_uGC(dc,"__utmc="+_udh,";"))!="-") c+=escape("__utmc="+t+";+");
 if ((t=_uGC(dc,"__utmz="+_udh,";"))!="-") c+=escape("__utmz="+t+";+");
 if ((t=_uGC(dc,"__utmv="+_udh,";"))!="-") c+=escape("__utmv="+t+";");
 if (c.charAt(c.length-1)=="+") c=c.substring(0,c.length-1);
 return c;
}
function _uGC(l,n,s) {
 if (!l || l=="" || !n || n=="" || !s || s=="") return "-";
 var i,i2,i3,c="-";
 i=l.indexOf(n);
 i3=n.indexOf("=")+1;
 if (i > -1) {
  i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }
  c=l.substring((i+i3),i2);
 }
 return c;
}
function _uDomain() {
 if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; }
 if (_udn=="auto") {
  var d=_ubd.domain;
  if (d.substring(0,4)=="www.") {
   d=d.substring(4,d.length);
  }
  _udn=d;
 }
 if (_uhash=="off") return 1;
 return _uHash(_udn);
}
function _uHash(d) {
 if (!d || d=="") return 1;
 var h=0,g=0;
 for (var i=d.length-1;i>=0;i--) {
  var c=parseInt(d.charCodeAt(i));
  h=((h << 6) & 0xfffffff) + c + (c << 14);
  if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21));
 }
 return h;
}
function _uFixA(c,s,t) {
 if (!c || c=="" || !s || s=="" || !t || t=="") return "-";
 var a=_uGC(c,"__utma="+_udh,s);
 var lt=0,i=0;
 if ((i=a.lastIndexOf(".")) > 9) {
  _uns=a.substring(i+1,a.length);
  _uns=(_uns*1)+1;
  a=a.substring(0,i);
  if ((i=a.lastIndexOf(".")) > 7) {
   lt=a.substring(i+1,a.length);
   a=a.substring(0,i);
  }
  if ((i=a.lastIndexOf(".")) > 5) {
   a=a.substring(0,i);
  }
  a+="."+lt+"."+t+"."+_uns;
 }
 return a;
}
function _uTrim(s) {
  if (!s || s=="") return "";
  while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length);
  while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1);
  return s;
}
function _uEC(s) {
  var n="";
  if (!s || s=="") return "";
  for (var i=0;i<s.length;i++) {if (s.charAt(i)==" ") n+="+"; else n+=s.charAt(i);}
  return n;
}
function __utmVisitorCode() {
 var r=0,t=0,i=0,i2=0,m=31;
 var a=_uGC(_ubd.cookie,"__utma="+_udh,";");
 if ((i=a.indexOf(".",0))<0) return;
 if ((i2=a.indexOf(".",i+1))>0) r=a.substring(i+1,i2); else return "";  
 if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return "";  
 var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
 return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m];
}
function _uIN(n) {
 if (!n) return false;
 for (i=0;i<n.length;i++) {
  var c=n.charAt(i);
  if ((c<"0" || c>"9") && (c!=".")) return false;
 }
 return true;
}
