///* debug */

///* ncjerror_handler.js */
var gOldOnError = window.onerror;

// Override previous handler.
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    //its same as $.browser.msie && $.browser.version < 7 - but jquery can be not loaded in this time - so need use direct check
    var vIE = -1;
    if (navigator.appName=='Microsoft Internet Explorer')
        vIE = (new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})")).exec(navigator.userAgent)[1];
    if (vIE > 0 && vIE < 7)
        return false;

    var l = document.location;
    var host = (l.host == 'code.avaaz.org' || l.host == 'team.avaaz.org' ? l.host : 'secure.avaaz.org');
    var img = new Image();
    var newErrMsg = errorMsg;
    if (newErrMsg.length > 200) {
        newErrMsg = newErrMsg.substring(0, 197);
        newErrMsg += '...';
    }
    img.src = 'https://' + host + '/act/error_handler_js.php?err=' + escape(newErrMsg) + '&file=' + escape(url) + '&line=' + escape(lineNumber);

    //not show errors in not chrome browsers
    if (navigator.appVersion.indexOf('Mac') != -1 || $.browser.safari || l.host == 'code.avaaz.org' || l.host == 'team.avaaz.org') {
        if (typeof(console) != 'undefined' && console)
            if (typeof(console.log) == "function")
                console.log("Msg:" + newErrMsg + "\n file: " + url + ":" + lineNumber);
    }
    if (gOldOnError)
      // Call previous handler.
      return gOldOnError(errorMsg, url, lineNumber);

  // Just let default handler run.
  return false;
};

///* ncjtrack.js */
/*
var w = window, d = document, l = d.location;
if (w.addEventListener) // Normal browsers
    w.addEventListener('load', track, false);
else if (w.attachEvent) // Stupid IE
    w.attachEvent('onload', track);
else if (window.$) // Houston, we have a problem
    $(track);
*/

(function(w, d, l)
{
    var track = function(need_load, undef)
        {
            if (need_load == undef)
            {
                var getLast = function(collection)
                    {
                        for (var i = collection.length; i > 0; i--)
                        {
                            if (collection[i].tagName == 'input' && collection[i].type == 'hidden')
                                return collection[i].value;
                        }
                        return '';
                    };
                w.tracking = {
                    cid : getLast(d.getElementsByName('cid')),
                    lang : getLast(d.getElementsByName('last'))
                };
            }
            var params = ['ref=' + (encodeURIComponent(d.referrer) || ''), 'rnd=' + new Date().getTime(), 'url=' + escape(l.href)],
                host = (('undefined' !== typeof cid && cid == 1402) ? '69.60.9.230' : (l.host == 'code.avaaz.org' || l.host == 'team.avaaz.org' ? l.host : 'stats.avaaz.org'));

            for (var i in w.tracking) params.push(i + '=' + w.tracking[i]);

            var img = new Image();
            img.src = 'https://' + host + '/act/open/track.php?' + params.join('&');
            return;
        };

    if (!w.tracking)
    {
        if (w.addEventListener) // Normal browsers
            w.addEventListener('load', track, false);
        else if (w.attachEvent) // Stupid IE
            w.attachEvent('onload', track);
        else if (window.$) // Houston, we have a problem
            $(track);
    }
    else track(1);
})(window, document, document.location);

///* cjSocialHistory.js */
/*
 * Social Limit - Only the social you care about.
 *
 * Enables your site to know which social bookmarking badges to display to your
 * visitors. It tells you all social sites the user has gone to, or you can
 * query for a specific one.
 *
 * For example:
 *
 *    var sl = SocialHistory();
 *    alert( sl.doesVisit("Digg") ); // Returns true/false, -1 if unknown.
 *    var listOfVisitedSites = sl.visitedSites();
 *    var checkedSites = sl.checkedSites();
 *
 * If you want to add more sites to check, you can pass that in as a dictionary
 * to History:
 *
 *    var more = { "Humanized": "http://humanized.com",
 *                 "Azarask.in": ["http://azarask.in", "http://azarask.in/blog"]
 *               };
 *    var sl = SocialHistory(more);
 *    alert( sl.doesVisit("Humanized") );
 *
 * For a list of built-in sites, see the sites variable below.
 *
 * Copyright (c) 2008 Aza Raskin (http://azarask.in/blog)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 */

var SocialHistory = function( moreSites ){

  var sites = {
	  "Orkut": ["http://www.orkut.com/", "http://www.orkut.com/Main#Home"],
	  "Twitter": ["http://twitter.com/", "http://twitter.com/login"],
    "Digg": ["http://digg.com", "http://digg.com/login"],
    "Reddit": ["http://reddit.com", "http://reddit.com/new/", "http://reddit.com/controversial/", "http://reddit.com/top/", "http://reddit.com/r/reddit.com/", "http://reddit.com/r/programming/"],
    "StumbleUpon": ["http://stumbleupon.com"],
    "Yahoo Buzz": ["http://buzz.yahoo.com"],
    "Facebook": ["http://facebook.com/home.php", "http://facebook.com", "https://login.facebook.com/login.php"],
    "Del.icio.us": ["https://secure.del.icio.us/login", "http://del.icio.us/"],
    "MySpace": ["http://www.myspace.com/"],
    "Technorati": ["http://www.technorati.com"],
    "Newsvine": ["https://www.newsvine.com", "https://www.newsvine.com/_tools/user/login"],
    "Songza": ["http://songza.com"],
    "Slashdot": ["http://slashdot.org/"],
    "Ma.gnolia": ["http://ma.gnolia.com/"],
    "Blinklist": ["http://www.blinklist.com"],
    "Furl": ["http://furl.net", "http://furl.net/members/login"],
    "Mister Wong": ["http://www.mister-wong.com"],
    "Current": ["http://current.com", "http://current.com/login.html"],
    "Menaeme": ["http://meneame.net", "http://meneame.net/login.php"],
    "Oknotizie": ["http://oknotizie.alice.it", "http://oknotizie.alice.it/login.html.php"],
    "Diigo": ["http://www.diigo.com/", "https://secure.diigo.com/sign-in"],
    "Funp": ["http://funp.com", "http://funp.com/account/loginpage.php"],
    "Blogmarks": ["http://blogmarks.net"],
    "Yahoo Bookmarks": ["http://bookmarks.yahoo.com"],
    "Xanga": ["http://xanga.com"],
    "Blogger": ["http://blogger.com"],
    "Last.fm": ["http://www.last.fm/", "https://www.last.fm/login/"],
    "N4G": ["http://www.n4g.com"],
    "Faves": ["http://faves.com", "http://faves.com/home", "https://secure.faves.com/signIn"],
    "Simpy": ["http://www.simpy.com", "http://www.simpy.com/login"],
    "Yigg": ["http://www.yigg.de"],
    "Kirtsy": ["http://www.kirtsy.com", "http://www.kirtsy.com/login.php"],
    "Fark": ["http://www.fark.com", "http://cgi.fark.com/cgi/fark/users.pl?self=1"],
    "Mixx": ["https://www.mixx.com/login/dual", "http://www.mixx.com"],
    "Google Bookmarks": ["http://www.google.com/bookmarks", "http://www.google.com/ig/add?moduleurl=bookmarks.xml&hl=en"],
    "Subbmitt": ["http://subbmitt.com/"],
    "GoogleMail": ["https://mail.google.com/mail/?tab=om", "https://mail.google.com/mail/", "https://mail.google.com/mail/?shva=1#inbox"]
  };
 
  for( var site in moreSites ) {
    // If we don't have the site, create the URL list.
    if( typeof( sites[site] ) == "undefined" ) sites[site] = [];
   
    // If the value is string, just push that onto the URL list.
    if( typeof( moreSites[site] ) == "string" )
      sites[site].push( moreSites[site] );
    else
      sites[site] = sites[site].concat( moreSites[site] );
  }
 
  var visited = {};

  function getStyle(el, scopeDoc,styleProp) {
    if (el.currentStyle)
      var y = el.currentStyle[styleProp];
    else if (window.getComputedStyle)
      var y = scopeDoc.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
    return y;
  }
 
  function remove( el ) {
    el.parentNode.removeChild( el );
  }
 
  // Code inspired by:
  // bindzus.wordpress.com/2007/12/24/adding-dynamic-contents-to-iframes
  function createIframe() {
    var iframe = document.createElement("iframe");
    iframe.style.position = "absolute";
    iframe.style.visibility = "hidden";

    document.body.appendChild(iframe);

    // Firefox, Opera
    if(iframe.contentDocument) iframe.doc = iframe.contentDocument;
    // Internet Explorer
    else if(iframe.contentWindow) iframe.doc = iframe.contentWindow.document;

    // Magic: Force creation of the body (which is null by default in IE).
    // Also force the styles of visited/not-visted links.
    iframe.doc.open();
        iframe.doc.write('<style>');
        iframe.doc.write("a{color: #000000; display:none;}");  
        iframe.doc.write("a:visited {color: #FF0000; display:inline;}");        
        iframe.doc.write('</style>');
    iframe.doc.close();
   
    // Return the iframe: iframe.doc contains the iframe.
    return iframe;
  }  

  var iframe = createIframe();
 
  function embedLinkInIframe( href, text ) {
    var a = iframe.doc.createElement("a");
    a.href = href;
    a.innerHTML = site;
    iframe.doc.body.appendChild( a );
  }
 
  for( var site in sites ) {
    var urls = sites[site];
    for( var i=0; i<urls.length; i++ ) {
      // You have to create elements in the scope of the iframe for IE.
      embedLinkInIframe( urls[i], site );
     
      // Automatically try variations of the URLS with and without the "www"
      if( urls[i].match(/www\./) ){
        var sansWWW = urls[i].replace(/www\./, "");
        embedLinkInIframe( sansWWW, site );
      } else {
        // 2 = 1 for length of string + 1 for slice offset
        var httpLen = urls[i].indexOf("//") + 2;
        var withWWW = urls[i].substring(0, httpLen ) + "www." + urls[i].substring( httpLen );
        embedLinkInIframe( withWWW, site );
      }
     
    }
  }
   
  var links = iframe.doc.body.childNodes;
  for( var i=0; i<links.length; i++) {
    // Handle both Firefox/Safari, and IE (respectively)
    var displayValue = getStyle(links[i], iframe.doc, "display");
    var didVisit = displayValue != "none";
     
    if( didVisit ){
      visited[ links[i].innerHTML ] = true;
    }
  }
 
  remove( iframe );
 
  return new (function(){
    var usedSites = [];
    for( var site in visited ){
      usedSites.push( site );
    }
   
    // Return an array of visited sites.
    this.visitedSites = function() {
      return usedSites;
    }
   
    // Return true/false. If we didn't check the site, return -1.
    this.doesVisit = function( site ) {
      if( typeof( sites[site] ) == "undefined" )
        return -1;
      return typeof( visited[site] ) != "undefined";
    }
   
    var checkedSites = [];
    for( var site in sites ){
      checkedSites.push( site );
    }
    // Return a list of the sites checked.
    this.checkedSites = function(){
      return checkedSites;
    }
  })();
}


///* ncjcookie.js */
/*
Script Name: Javascript Cookie Script
Author: Public Domain, with some modifications
Script Source URI: http://techpatterns.com/downloads/javascript_cookies.php
Version 1.1.2
Last Update: 5 November 2009

Changes:
1.1.2 explicitly declares i in Get_Cookie with var
1.1.1 fixes a problem with Get_Cookie that did not correctly handle case
where cookie is initialized but it has no "=" and thus no value, the
Get_Cookie function generates a NULL exception. This was pointed out by olivier, thanks
1.1.0 fixes a problem with Get_Cookie that did not correctly handle
cases where multiple cookies might test as the same, like: site1, site
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

// this fixes an issue with the old method, ambiguous values
// with this test document.cookie.indexOf( name + "=" );

// To use, simple do: Get_Cookie('cookie_name');
// replace cookie_name with the real cookie name, '' are required
function Get_Cookie( check_name ) {
	// first we'll split this cookie up into name/value pairs
	// note: document.cookie only returns name=value, not the other components
	var a_all_cookies = '';
	try {
		a_all_cookies = document.cookie.split( ';' );
	} catch(err) {
	};
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f
	var i = '';

	for ( i = 0; i < a_all_cookies.length; i++ )
	{
		// now we'll split apart each name=value pair
		a_temp_cookie = a_all_cookies[i].split( '=' );


		// and trim left/right whitespace while we're at it
		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

		// if the extracted name matches passed check_name
		if ( cookie_name == check_name )
		{
			b_cookie_found = true;
			// we need to handle case where cookie has no value but exists (no = sign, that is):
			if ( a_temp_cookie.length > 1 )
			{
				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
			}
			// note that in cases where cookie is initialized but no value, null is returned
			return cookie_value;
			break;
		}
		a_temp_cookie = null;
		cookie_name = '';
	}
	if ( !b_cookie_found )
	{
		return null;
	}
}

/*
only the first 2 parameters are required, the cookie name, the cookie
value. Cookie time is in milliseconds, so the below expires will make the
number you pass in the Set_Cookie function call the number of days the cookie
lasts, if you want it to be hours or minutes, just get rid of 24 and 60.

Generally you don't need to worry about domain, path or secure for most applications
so unless you need that, leave those parameters blank in the function call.
*/
function Set_Cookie( name, value, expires, path, domain, secure ) {
	// set time, it's in milliseconds
	var today = new Date();
	today.setTime( today.getTime() );
	// if the expires variable is set, make the correct expires time, the
	// current script below will set it for x number of days, to make it
	// for hours, delete * 24, for minutes, delete * 60 * 24
	if ( expires )
	{
		expires = expires * 1000 * 60 * 60 * 24;
	}
	//alert( 'today ' + today.toGMTString() );// this is for testing purpose only
	var expires_date = new Date( today.getTime() + (expires) );
	//alert('expires ' + expires_date.toGMTString());// this is for testing purposes only

	document.cookie = name + "=" +escape( value ) +
		( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + //expires.toGMTString()
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}

// this deletes the cookie when called
function Delete_Cookie( name, path, domain ) {
	if ( Get_Cookie( name ) ) document.cookie = name + "=" +
			( ( path ) ? ";path=" + path : "") +
			( ( domain ) ? ";domain=" + domain : "" ) +
			";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

///* ncjglobal.js */
/**
 * This file used for miscellaneous functions, need entire all all project
 */

/**
 * Get image src according to current page port (80|443). #566 bug in IE
 * @param string input SRC of need image in amazon
 */
function get_secure_src(input)
{
    // trim string (IE - burn in the hell!)
    return (
        document.location.protocol == 'https:' &&
        input.indexOf('amazonaws.com') != -1
    ) ? input.replace(/\s*((\S+\s*)*)/, "$1").replace(/((\s*\S+)*)\s*/, "$1").replace(/^http:\/\//, "https://") : input;
}

function SetEmailDomain(email) {
    if (email) {
        var my_email = email;
        var ind = my_email.indexOf("@");
        domain = my_email.substr((ind+1));
        domain = domain.split('.')[0];
    }
    domain = domain?domain:'other';
    Set_Cookie('lastusedemail', domain,"", "/", '.avaaz.org');
}

function SetDomain(domain) {
    Set_Cookie('lastusedemail', domain, 180, "/", '.avaaz.org');
}

function GetEmailDomain() {
    var domain = Get_Cookie('lastusedemail');
    if (!domain) return 'other';
    return domain;
}

function initSocialHistory() {
    if ('function' === typeof SocialHistory)
    {
	if ($('form').length > 0) {
	  var sl = SocialHistory();
	  var visited_sites = sl.visitedSites().join(',');
	  if (visited_sites && visited_sites.length)
	    $('form').each(
	      function() {
		  $(this).append(
		    "<input name=\"user_social_hisoty\" type=\"hidden\" value=\""+visited_sites+"\" />"
		  )
	      }
	    );
	}
    }
}
function getArgs(query) {
    var args = new Object();
    var query = query?query:location.search.substring(1);     // Get query string
    var pairs = query.split("&");                 // Break at ampersand
    for(var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');          // Look for "name=value"
        if (pos == -1) continue;                  // If not found, skip
        var argname = pairs[i].substring(0,pos);  // Extract the name
        var value = pairs[i].substring(pos + 1);    // Extract the value
        value = decodeURIComponent(value);        // Decode it, if needed
        args[argname] = value;                    // Store as a property
    }
    return args;                                  // Return the object
}
function getEdgeData(data, text) {
    for (key in data) {
        reg = RegExp("\{"+key+"\}", "ig");
        text = text.replace(reg, data[key]);
        reg = RegExp("tag_open"+key+"tag_close", "ig");
        text = text.replace(reg, data[key]);
    }
    return text
}
function hashing() {
    var args = new Object();
    var query = location.search.substring(1);     // Get query string
    var pairs = query.split("&");                 // Break at ampersand
    for(var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');          // Look for "name=value"
        if (pos == -1) {
            var argname = pairs[i];
            args[argname] = null;
        }                  // If not found, skip
        else
        {
            var argname = pairs[i].substring(0,pos);  // Extract the name
            var value = pairs[i].substring(pos + 1);    // Extract the value
            value = decodeURIComponent(value);        // Decode it, if needed
            args[argname] = value;                    // Store as a property
        }
    }
    var cnt = 0;
    for (var h in args) {
        var name = false;
        if (!args[h]) {
            cnt++;
            if (1 === cnt) {
                name = 'hash';
            }
            var bv = parseInt(h);
            if (!isNaN(bv) && 0 !== bv) {
                name = 'blast_version';
            }
            if (name) {
                $('form').each(function(){
                    $(this).append('<input type="hidden" name="'+name+'" value="' +h+ '"/>');
                });
            }

        }
    }
}
function count (mixed_var, mode) {
    var key, cnt = 0;
    if (mixed_var === null){        return 0;
    } else if (mixed_var.constructor !== Array && mixed_var.constructor !== Object){
        return 1;
    }
     if (mode === 'COUNT_RECURSIVE') {
        mode = 1;
    }
    if (mode != 1) {
        mode = 0;    }

    for (key in mixed_var){
        cnt++;
        if ( mode==1 && mixed_var[key] && (mixed_var[key].constructor === Array || mixed_var[key].constructor === Object) ){            cnt += this.count(mixed_var[key], 1);
        }
    }

    return cnt;
}
$(document).ready(function(){
    hashing();
    $('img[securesrc]').each(function(){
        el = $(this);
        el.attr('src', get_secure_src(el.attr('securesrc')));
    });

    initSocialHistory();
    /***fix for ie 7 ***/
    if ($.browser.msie) {
		$('body').append('<div id="ie_hack_div" style="position:absolute;top:-10000px"></div>');
		$('.buttonwrapper > button').each(function(){
			$('#ie_hack_div').html($(this).parent().parent().html());
			var span = $('span', '#ie_hack_div').get(0);
			var em   = $('em', '#ie_hack_div').get(0);
			if(span && em){
				$(this).css('width',($(span).innerWidth()+$(em).innerWidth()) + 5);
			}
		});
    }
	if ('function' === typeof $().popupWindow)
	{
		$('a.tw', '#share-links').popupWindow({
			centerBrowser:1,
			windowURL:'http://twitter.com/intent/follow?region=follow&screen_name=avaaz',
			windowName:'twitter_popup_follow'
	    });
	}
    // Traffic split - change HOME links to traffic split source
    var sSplitOrigin = Get_Cookie('split_origin');
    if (sSplitOrigin) {
        $('#logo > a, #nav > .links > .first > a').attr('href', sSplitOrigin);
    }
});

///* ncjjquery.toggleval.js */
/* -------------------------------------------------- *
 * ToggleVal 3.0
 * Updated: 01/15/2010
 * -------------------------------------------------- *
 * Author: Aaron Kuzemchak
 * URL: http://aaronkuzemchak.com/
 * Copyright: 2008-2010 Aaron Kuzemchak
 * License: MIT License
** -------------------------------------------------- */

(function($) {
	// main plugin function
	$.fn.toggleVal = function(theOptions) {
		// check whether we want real options, or to destroy functionality
		if(!theOptions || typeof theOptions == 'object') {
			theOptions = $.extend({}, $.fn.toggleVal.defaults, theOptions);
		}
		else if(typeof theOptions == 'string' && theOptions.toLowerCase() == 'destroy') {
			var destroy = true;
		}
		
		return this.each(function() {
			// unbind everything if we're destroying, and stop executing the script
			if(destroy) {
				$(this).unbind('focus.toggleval').unbind('blur.toggleval').removeData('defText');
				return false;
			}
			
			// define our variables
			var defText = '';
			
			// let's populate the field, if not default
			switch(theOptions.populateFrom) {
				case 'title':
					if($(this).attr('title')) {
						defText = $(this).attr('title');
						$(this).val(defText);
					}
					break;
				case 'label':
					if($(this).attr('id')) {
						defText = $('label[for="' + $(this).attr('id') + '"]').text();
						$(this).val(defText);
					}
					break;
				case 'custom':
					defText = theOptions.text;
					$(this).val(defText);
					break;
				default:
					defText = $(this).val();
			}
			
			// let's give this field a special class, so we can identify it later
			// also, we'll give it a data attribute, which will help jQuery remember what the default value is
			$(this).addClass('toggleval').data('defText', defText);
			
			// now that fields are populated, let's remove the labels if applicable
			if(theOptions.removeLabels == true && $(this).attr('id')) {
				$('label[for="' + $(this).attr('id') + '"]').remove();
			}
			
			// on to the good stuff... the focus and blur actions
			$(this).bind('focus.toggleval', function() {
				if($(this).val() == $(this).data('defText')) { $(this).val(''); }
				
				// add the focusClass, remove changedClass
				$(this).addClass(theOptions.focusClass);
			}).bind('blur.toggleval', function() {
				if($(this).val() == '' && !theOptions.sticky) { $(this).val($(this).data('defText')); }
				
				// remove focusClass, add changedClass if, well, different
				$(this).removeClass(theOptions.focusClass);
				if($(this).val() != '' && $(this).val() != $(this).data('defText')) { $(this).addClass(theOptions.changedClass); }
					else { $(this).removeClass(theOptions.changedClass); }
			});
		});
	};
	
	// default options
	$.fn.toggleVal.defaults = {
		focusClass: 'tv-focused', // class during focus
		changedClass: 'tv-changed', // class after focus
		populateFrom: 'title', // choose from: default, label, custom, or title
		text: null, // text to use in conjunction with populateFrom: custom
		removeLabels: false, // remove labels associated with the fields
		sticky: false // if true, default text won't reappear
	};
	
	// create custom selectors
	// :toggleval for affected elements
	// :changed for changed elements
	$.extend($.expr[':'], {
		toggleval: function(elem) {
			return $(elem).data('defText') || false;
		},
		changed: function(elem) {
			if($(elem).data('defText') && $(elem).val() != $(elem).data('defText')) {
				return true;
			}
			return false;
		}
	});
})(jQuery);
///* ncjjquery.infieldlabel.js */
/*
 * In-Field Label jQuery Plugin
 * http://fuelyourcoding.com/scripts/infield.html
 *
 * Copyright (c) 2009 Doug Neiner
 * Dual licensed under the MIT and GPL licenses.
 * Uses the same license as jQuery, see:
 * http://docs.jquery.com/License
 *
 * @version 0.1
 */
(function($){
	
    $.InFieldLabelsSetPosition = function() {
        $('.set-label-position').filter(':visible').each(function(){
            $(this).trigger('setLabelPosition');
        }).removeClass('set-label-position');
    }
    
    $.InFieldLabels = function(label,field, options){
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;
        
        // Access to jQuery and DOM versions of each element
        base.$label = $(label);
        base.label = label;

 		base.$field = $(field);
		base.field = field;
        
		base.$label.data("InFieldLabels", base);
		base.showing = true;
        
        base.init = function(){
			// Merge supplied options with default options
            base.options = $.extend({},$.InFieldLabels.defaultOptions, options);

			// Check if the field is already filled in
			if(base.$field.val() != ""){
				base.$label.hide();
				//base.checkForEmpty();
				base.showing = false;
			} else {
			     base.$label.show();
			}
            base.$field.bind('setLabelPosition', {'base': base}, function(e){
                var base = e.data.base;
                if (!base.$label.hasClass('without-autocomment-detect')) {
                    var fieldPosition = base.$field.position();
                    if ('rtl' == $('html').attr('dir')) {
                        base.$label.css({
                          'right' : fieldPosition.right,
                          'top' : fieldPosition.top
                        });
                    } else {
                        base.$label.css({
                          'left' : fieldPosition.left,
                          'top' : fieldPosition.top
                        });
                    }
                    if(base.$field.css('padding-top')) {
                         base.$label.css({'padding-top':base.$field.css('padding-top')});
                    }
                    if(base.$field.css('padding-left')) {
                         base.$label.css({'padding-left':base.$field.css('padding-left')});
                    }
                    if(base.$field.css('padding-right')) {
                         base.$label.css({'padding-right':base.$field.css('padding-right')});
                    }
                    if(base.$field.css('padding-bottom')) {
                         base.$label.css({'padding-bottom':base.$field.css('padding-bottom')});
                    }
                    if(base.$field.css('margin-top')) {
                         base.$label.css({'padding-top':parseInt(base.$label.css('padding-top')) + parseInt(base.$field.css('margin-top'))+ 'px'});
                    }
                    if(base.$field.css('margin-left')) {
                         base.$label.css({'padding-left':parseInt(base.$label.css('padding-left')) + parseInt(base.$field.css('margin-left'))+ 'px'});
                    }
                    if(base.$field.css('border-top')) {
                         base.$label.css({'padding-top':parseInt(base.$label.css('padding-top')) + parseInt(base.$field.css('border-top'))+ 'px'});
                    }
                    if(base.$field.css('border-left')) {
                         base.$label.css({'padding-left':parseInt(base.$label.css('padding-left')) + parseInt(base.$field.css('border-left'))+ 'px'});
                    }
                }
            });
            base.$field.trigger('setLabelPosition');
                        
            base.$field.bind('checkempty', function(e){
                base.checkForEmpty(true);
            }).focus(function(){
				//base.checkForEmpty(true);
				base.fadeOnFocus();
			}).blur(function(){
				base.checkForEmpty(true);				
			}).bind('keydown.infieldlabel',function(e){
				// Use of a namespace (.infieldlabel) allows us to
				// unbind just this method later
				base.hideOnChange(e);
			}).change(function(e){
				base.checkForEmpty();
			}).bind('onPropertyChange', function(){
				base.checkForEmpty();
			});
        };

		// If the label is currently showing
		// then fade it down to the amount
		// specified in the settings
		base.fadeOnFocus = function(){
			
			if(base.showing){
				base.setOpacity(base.options.fadeOpacity);
			};
		};
		
		base.setOpacity = function(opacity){
			
			base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration,function(){$(this).css('filter', 'none');});
            //base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
            //base.$label.stop().css({ opacity: opacity });
			if (1.0  == opacity)
			{
				base.$label.removeClass('labeloverlayhidden');
			} else {
				base.$label.addClass('labeloverlayhidden');
			}
			base.showing = (opacity > 0.0);
		};
		
		// Checks for empty as a fail safe
		// set blur to true when passing from
		// the blur event
		base.checkForEmpty = function(blur){
			if(base.$field.val() == ""){
				
				base.prepForShow();
				base.setOpacity( blur ? 1.0 : base.options.fadeOpacity );
			} else {
				
				base.setOpacity(0.0);
			};
		};
		
		base.prepForShow = function(e){
			
			if(!base.showing) {
				
				// Prepare for a animate in...
				base.$label.css({opacity: 0.0}).show();
				
				// Reattach the keydown event
				base.$field.bind('keydown.infieldlabel',function(e){
					base.hideOnChange(e);
				});
			};
		};

		base.hideOnChange = function(e){
			
			if(
				(e.keyCode == 16) || // Skip Shift
				(e.keyCode == 9) // Skip Tab
			  ) return; 
			
			if(base.showing){
				
				base.$label.hide();
				base.showing = false;
			};
			
			// Remove keydown event to save on CPU processing
			base.$field.unbind('keydown.infieldlabel');
		};
      
		// Run the initialization method
        base.init();
    };
	
    $.InFieldLabels.defaultOptions = {
        fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be
		fadeDuration: 300 // How long should it take to animate from 1.0 opacity to the fadeOpacity
    };
	

    $.fn.inFieldLabels = function(options){
        return this.each(function(){
			// Find input or textarea based on for= attribute
			// The for attribute on the label must contain the ID
			// of the input or textarea element
			var for_attr = $(this).attr('for');
			if( !for_attr ) return; // Nothing to attach, since the for field wasn't used
			
			
			// Find the referenced input or textarea element
			var $field = $(
				"input#" + for_attr + "[type='text']," + 
				"input#" + for_attr + "[type='password']," + 
				"textarea#" + for_attr
				);
				
			if( $field.length == 0) return; // Again, nothing to attach
			if (!$($field[0]).is(':visible')){
			   $($field[0]).addClass('set-label-position');
			} 
            // Only create object for input[text], input[password], or textarea
            (new $.InFieldLabels(this, $field[0], options));
        });
    };
	
})(jQuery);

///* ncjactions.js */


$(document).ready(function()
{
    /* adjust styling for macosx-based browsers */
    if (navigator.appVersion.indexOf('Mac') != -1 || $.browser.safari) {
        var randVal = Math.round((new Date()).getTime() / (1000 * 3600));
        $('head').append('<link type="text/css" rel="stylesheet" media="all" href="/stat/new/common/css/css.php/s='+ randVal + '&fe=%252Fnew%252Fcss%252Fblue%252Fmacosx.css&h=' + randVal + '" />');
    }
	 if ($('html').attr('dir')=='rtl' && (navigator.appVersion.indexOf('Mac') != -1 || $.browser.safari)) {
        $('.title-ribbon, .photo-ribbon').wrap('<div class="rtlwrap">');
    }

	if (typeof jQuery.fn.toggleVal == 'function') {
		$('.form-text').toggleVal();
	}


    // onrollover link for #focus-photo-feature
    $("#focus-photo-feature .content a").hover(
        function () {
            $(this).find('img').attr('src', function() {
                return this.src.replace('.png', '_ovr.png');
            });
        },
        function () {
            $(this).find('img').attr('src', function() {
                return this.src.replace('_ovr', '');
            });
        }
    );

	// controls action signup popup
    /*$('#header-top #signup a.link_actionsignup').click(function()
	{
		$(this).toggleClass('active');
    	$('#box-action-signup').toggleClass('box-expand');
    	$('#header-top #signup').toggleClass('active');
    });*/

     /*$(".buttonwrapper .form-submit").not('.no_js_hover').hover(
        function () {
            src = $(this).css('background-image');
            src = src.replace('_ovr', '');
            $(this).css('background-image', src.replace('.png', '_ovr.png'));

            $(this).siblings('img').attr('src', function() {
                var src = this.src.replace('_ovr', '');
                return src.replace('.png', '_ovr.png');
            });

            $(this).find('img').attr('src', function() {
                var src = this.src.replace('_ovr', '');
                return src.replace('.png', '_ovr.png');
            });
        },
        function () {
            src = $(this).css('background-image');
            $(this).css('background-image', src.replace('_ovr', ''));

            $(this).siblings('img').attr('src', function() {
                return this.src.replace('_ovr', '');
            });

            $(this).find('img').attr('src', function() {
                return this.src.replace('_ovr', '');
            });
        }
    );*/
});

$(document).ready(function(){
	if ('function' === typeof $('label').inFieldLabels)
	{
    $("label.labeloverlay").inFieldLabels();
	}
    $('form').each(function(){
var input_js = document.createElement('input');
    input_js.setAttribute('type', 'hidden');
    input_js.setAttribute('name', 'secure_validation');
    input_js.value = new Date();
        this.appendChild(input_js);
        var used_js = document.createElement('input');
        used_js.setAttribute('type', 'hidden');
        used_js.setAttribute('name', 'used_js');
        used_js.value = new Date();
        this.appendChild(used_js);
    });
    
    var placeholders;
    if (typeof signup_button_text != 'undefined') {
        placeholders = $('.form-sign .form-broken-js')
        if (typeof signup_button_text == 'object') {
            
            for (i = 0; i < signup_button_text.length; ++i) {
                $(placeholders[i]).replaceWith(signup_button_text[i]);
            }
        } else {
            placeholders.replaceWith(signup_button_text)
        }
    }
    
    if (typeof donate_button_text != 'undefined') {
        placeholders = $('.form-donate .form-broken-js')
        if (typeof donate_button_text == 'object') {
            
            for (i = 0; i < donate_button_text.length; ++i) {
                $(placeholders[i]).replaceWith(donate_button_text[i]);
            }
        } else {
            placeholders.replaceWith(donate_button_text)
        }
    }
});

///* cjjquery.validate.js */
/**
 * jQuery Validation Plugin 1.8.1
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2006 - 2011 Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($) {

$.extend($.fn, {
	// http://docs.jquery.com/Plugins/Validation/validate
	validate: function( options ) {

		// if nothing is selected, return nothing; can't chain anyway
		if (!this.length) {
			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
			return;
		}

		// check if a validator for this form was already created
		var validator = $.data(this[0], 'validator');
		if ( validator ) {
			return validator;
		}

		validator = new $.validator( options, this[0] );
		$.data(this[0], 'validator', validator);

		if ( validator.settings.onsubmit ) {

			// allow suppresing validation by adding a cancel class to the submit button
			this.find("input, button").filter(".cancel").click(function() {
				validator.cancelSubmit = true;
			});

			// when a submitHandler is used, capture the submitting button
			if (validator.settings.submitHandler) {
				this.find("input, button").filter(":submit").click(function() {
					validator.submitButton = this;
				});
			}

			// validate the form on submit
			this.submit( function( event ) {
				if ( validator.settings.debug )
					// prevent form submit to be able to see console output
					event.preventDefault();

				function handle() {
					if ( validator.settings.submitHandler ) {
						if (validator.submitButton) {
							// insert a hidden input as a replacement for the missing submit button
							var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
						}
						validator.settings.submitHandler.call( validator, validator.currentForm );
						if (validator.submitButton) {
							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
							hidden.remove();
						}
						return false;
					}
					return true;
				}

				// prevent submit for invalid forms or custom submit handlers
				if ( validator.cancelSubmit ) {
					validator.cancelSubmit = false;
					return handle();
				}
				if ( validator.form() ) {
					if ( validator.pendingRequest ) {
						validator.formSubmitted = true;
						return false;
					}
					return handle();
				} else {
					validator.focusInvalid();
					return false;
				}
			});
		}

		return validator;
	},
	// http://docs.jquery.com/Plugins/Validation/valid
	valid: function() {
        if ( $(this[0]).is('form')) {
            return this.validate().form();
        } else {
            var valid = true;
            var validator = $(this[0].form).validate();
            this.each(function() {
				valid &= validator.element(this);
            });
            return valid;
        }
    },
	// attributes: space seperated list of attributes to retrieve and remove
	removeAttrs: function(attributes) {
		var result = {},
			$element = this;
		$.each(attributes.split(/\s/), function(index, value) {
			result[value] = $element.attr(value);
			$element.removeAttr(value);
		});
		return result;
	},
	// http://docs.jquery.com/Plugins/Validation/rules
	rules: function(command, argument) {
		var element = this[0];

		if (command) {
			var settings = $.data(element.form, 'validator').settings;
			var staticRules = settings.rules;
			var existingRules = $.validator.staticRules(element);
			switch(command) {
			case "add":
				$.extend(existingRules, $.validator.normalizeRule(argument));
				staticRules[element.name] = existingRules;
				if (argument.messages)
					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
				break;
			case "remove":
				if (!argument) {
					delete staticRules[element.name];
					return existingRules;
				}
				var filtered = {};
				$.each(argument.split(/\s/), function(index, method) {
					filtered[method] = existingRules[method];
					delete existingRules[method];
				});
				return filtered;
			}
		}

		var data = $.validator.normalizeRules(
		$.extend(
			{},
			$.validator.metadataRules(element),
			$.validator.classRules(element),
			$.validator.attributeRules(element),
			$.validator.staticRules(element)
		), element);

		// make sure required is at front
		if (data.required) {
			var param = data.required;
			delete data.required;
			data = $.extend({required: param}, data);
		}

		return data;
	}
});

// Custom selectors
$.extend($.expr[":"], {
	// http://docs.jquery.com/Plugins/Validation/blank
	blank: function(a) {return !$.trim("" + a.value);},
	// http://docs.jquery.com/Plugins/Validation/filled
	filled: function(a) {return !!$.trim("" + a.value);},
	// http://docs.jquery.com/Plugins/Validation/unchecked
	unchecked: function(a) {return !a.checked;}
});

// constructor for validator
$.validator = function( options, form ) {
	this.settings = $.extend( true, {}, $.validator.defaults, options );
	this.currentForm = form;
	this.init();
};

$.validator.format = function(source, params) {
	if ( arguments.length == 1 )
		return function() {
			var args = $.makeArray(arguments);
			args.unshift(source);
			return $.validator.format.apply( this, args );
		};
	if ( arguments.length > 2 && params.constructor != Array  ) {
		params = $.makeArray(arguments).slice(1);
	}
	if ( params.constructor != Array ) {
		params = [ params ];
	}
	$.each(params, function(i, n) {
		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
	});
	return source;
};

$.extend($.validator, {

	defaults: {
		messages: {},
		groups: {},
		rules: {},
		errorClass: "error",
		validClass: "valid",
		errorElement: "label",
		focusInvalid: true,
		errorContainer: $( [] ),
		errorLabelContainer: $( [] ),
		onsubmit: true,
		ignore: [],
		ignoreTitle: false,
		onfocusin: function(element) {
			this.lastActive = element;

			// hide error label and remove error class on focus if enabled
			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
				this.addWrapper(this.errorsFor(element)).hide();
			}
		},
		onfocusout: function(element) {
			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
				this.element(element);
			}
		},
		onkeyup: function(element) {
			if ( element.name in this.submitted || element == this.lastElement ) {
				this.element(element);
			}
		},
		onclick: function(element) {
			// click on selects, radiobuttons and checkboxes
			if ( element.name in this.submitted )
				this.element(element);
			// or option elements, check parent select in that case
			else if (element.parentNode.name in this.submitted)
				this.element(element.parentNode);
		},
		highlight: function(element, errorClass, validClass) {
			if (element.type === 'radio') {
				this.findByName(element.name).addClass(errorClass).removeClass(validClass);
			} else {
				$(element).addClass(errorClass).removeClass(validClass);
			}
		},
		unhighlight: function(element, errorClass, validClass) {
			if (element.type === 'radio') {
				this.findByName(element.name).removeClass(errorClass).addClass(validClass);
			} else {
				$(element).removeClass(errorClass).addClass(validClass);
			}
		}
	},

	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
	setDefaults: function(settings) {
		$.extend( $.validator.defaults, settings );
	},

	messages: {
		required: "This field is required.",
		remote: "Please fix this field.",
		email: "Please enter a valid email address.",
		url: "Please enter a valid URL.",
		date: "Please enter a valid date.",
		dateISO: "Please enter a valid date (ISO).",
		number: "Please enter a valid number.",
		digits: "Please enter only digits.",
		creditcard: "Please enter a valid credit card number.",
		equalTo: "Please enter the same value again.",
		accept: "Please enter a value with a valid extension.",
		maxlength: $.validator.format("Please enter no more than {0} characters."),
		minlength: $.validator.format("Please enter at least {0} characters."),
		rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
		range: $.validator.format("Please enter a value between {0} and {1}."),
		max: $.validator.format("Please enter a value less than or equal to {0}."),
		min: $.validator.format("Please enter a value greater than or equal to {0}.")
	},

	autoCreateRanges: false,

	prototype: {

		init: function() {
			this.labelContainer = $(this.settings.errorLabelContainer);
			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
			this.submitted = {};
			this.valueCache = {};
			this.pendingRequest = 0;
			this.pending = {};
			this.invalid = {};
			this.reset();

			var groups = (this.groups = {});
			$.each(this.settings.groups, function(key, value) {
				$.each(value.split(/\s/), function(index, name) {
					groups[name] = key;
				});
			});
			var rules = this.settings.rules;
			$.each(rules, function(key, value) {
				rules[key] = $.validator.normalizeRule(value);
			});

			function delegate(event) {
				var validator = $.data(this[0].form, "validator"),
					eventType = "on" + event.type.replace(/^validate/, "");
				validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );
			}
			$(this.currentForm)
				.validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate)
				.validateDelegate(":radio, :checkbox, select, option", "click", delegate);

			if (this.settings.invalidHandler)
				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/form
		form: function() {
			this.checkForm();
			$.extend(this.submitted, this.errorMap);
			this.invalid = $.extend({}, this.errorMap);
			if (!this.valid())
				$(this.currentForm).triggerHandler("invalid-form", [this]);
			this.showErrors();
			return this.valid();
		},

		checkForm: function() {
			this.prepareForm();
			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
				this.check( elements[i] );
			}
			return this.valid();
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/element
		element: function( element ) {
			element = this.clean( element );
			this.lastElement = element;
			this.prepareElement( element );
			this.currentElements = $(element);
			var result = this.check( element );
			if ( result ) {
				delete this.invalid[element.name];
			} else {
				this.invalid[element.name] = true;
			}
			if ( !this.numberOfInvalids() ) {
				// Hide error containers on last error
				this.toHide = this.toHide.add( this.containers );
			}
			this.showErrors();
			return result;
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
		showErrors: function(errors) {
			if(errors) {
				// add items to error list and map
				$.extend( this.errorMap, errors );
				this.errorList = [];
				for ( var name in errors ) {
					this.errorList.push({
						message: errors[name],
						element: this.findByName(name)[0]
					});
				}
				// remove items from success list
				this.successList = $.grep( this.successList, function(element) {
					return !(element.name in errors);
				});
			}
			this.settings.showErrors
				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
				: this.defaultShowErrors();
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
		resetForm: function() {
			if ( $.fn.resetForm )
				$( this.currentForm ).resetForm();
			this.submitted = {};
			this.prepareForm();
			this.hideErrors();
			this.elements().removeClass( this.settings.errorClass );
		},

		numberOfInvalids: function() {
			return this.objectLength(this.invalid);
		},

		objectLength: function( obj ) {
			var count = 0;
			for ( var i in obj )
				count++;
			return count;
		},

		hideErrors: function() {
			this.addWrapper( this.toHide ).hide();
		},

		valid: function() {
			return this.size() == 0;
		},

		size: function() {
			return this.errorList.length;
		},

		focusInvalid: function() {
			if( this.settings.focusInvalid ) {
				try {
					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
					.filter(":visible")
					.focus()
					// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
					.trigger("focusin");
				} catch(e) {
					// ignore IE throwing errors when focusing hidden elements
				}
			}
		},

		findLastActive: function() {
			var lastActive = this.lastActive;
			return lastActive && $.grep(this.errorList, function(n) {
				return n.element.name == lastActive.name;
			}).length == 1 && lastActive;
		},

		elements: function() {
			var validator = this,
				rulesCache = {};

			// select all valid inputs inside the form (no submit or reset buttons)
			return $(this.currentForm)
			.find("input, select, textarea")
			.not(":submit, :reset, :image, [disabled]")
			.not( this.settings.ignore )
			.filter(function() {
				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);

				// select only the first element for each name, and only those with rules specified
				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
					return false;

				rulesCache[this.name] = true;
				return true;
			});
		},

		clean: function( selector ) {
			return $( selector )[0];
		},

		errors: function() {
			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
		},

		reset: function() {
			this.successList = [];
			this.errorList = [];
			this.errorMap = {};
			this.toShow = $([]);
			this.toHide = $([]);
			this.currentElements = $([]);
		},

		prepareForm: function() {
			this.reset();
			this.toHide = this.errors().add( this.containers );
		},

		prepareElement: function( element ) {
			this.reset();
			this.toHide = this.errorsFor(element);
		},

		check: function( element ) {
			element = this.clean( element );

			// if radio/checkbox, validate first element in group instead
			if (this.checkable(element)) {
				element = this.findByName( element.name ).not(this.settings.ignore)[0];
			}

			var rules = $(element).rules();
			var dependencyMismatch = false;
			for (var method in rules ) {
				var rule = { method: method, parameters: rules[method] };
				try {
					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );

					// if a method indicates that the field is optional and therefore valid,
					// don't mark it as valid when there are no other rules
					if ( result == "dependency-mismatch" ) {
						dependencyMismatch = true;
						continue;
					}
					dependencyMismatch = false;

					if ( result == "pending" ) {
						this.toHide = this.toHide.not( this.errorsFor(element) );
						return;
					}

					if( !result ) {
						this.formatAndAdd( element, rule );
						return false;
					}
				} catch(e) {
					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
						 + ", check the '" + rule.method + "' method", e);
					throw e;
				}
			}
			if (dependencyMismatch)
				return;
			if ( this.objectLength(rules) )
				this.successList.push(element);
			return true;
		},

		// return the custom message for the given element and validation method
		// specified in the element's "messages" metadata
		customMetaMessage: function(element, method) {
			if (!$.metadata)
				return;

			var meta = this.settings.meta
				? $(element).metadata()[this.settings.meta]
				: $(element).metadata();

			return meta && meta.messages && meta.messages[method];
		},

		// return the custom message for the given element name and validation method
		customMessage: function( name, method ) {
			var m = this.settings.messages[name];
			return m && (m.constructor == String
				? m
				: m[method]);
		},

		// return the first defined argument, allowing empty strings
		findDefined: function() {
			for(var i = 0; i < arguments.length; i++) {
				if (arguments[i] !== undefined)
					return arguments[i];
			}
			return undefined;
		},

		defaultMessage: function( element, method) {
			return this.findDefined(
				this.customMessage( element.name, method ),
				this.customMetaMessage( element, method ),
				// title is never undefined, so handle empty string as undefined
				!this.settings.ignoreTitle && element.title || undefined,
				$.validator.messages[method],
				"<strong>Warning: No message defined for " + element.name + "</strong>"
			);
		},

		formatAndAdd: function( element, rule ) {
			var message = this.defaultMessage( element, rule.method ),
				theregex = /\$?\{(\d+)\}/g;
			if ( typeof message == "function" ) {
				message = message.call(this, rule.parameters, element);
			} else if (theregex.test(message)) {
				message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
			}
			this.errorList.push({
				message: message,
				element: element
			});

			this.errorMap[element.name] = message;
			this.submitted[element.name] = message;
		},

		addWrapper: function(toToggle) {
			if ( this.settings.wrapper )
				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
			return toToggle;
		},

		defaultShowErrors: function() {
			for ( var i = 0; this.errorList[i]; i++ ) {
				var error = this.errorList[i];
				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
				this.showLabel( error.element, error.message );
			}
			if( this.errorList.length ) {
				this.toShow = this.toShow.add( this.containers );
			}
			if (this.settings.success) {
				for ( var i = 0; this.successList[i]; i++ ) {
					this.showLabel( this.successList[i] );
				}
			}
			if (this.settings.unhighlight) {
				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
				}
			}
			this.toHide = this.toHide.not( this.toShow );
			this.hideErrors();
			this.addWrapper( this.toShow ).show();
		},

		validElements: function() {
			return this.currentElements.not(this.invalidElements());
		},

		invalidElements: function() {
			return $(this.errorList).map(function() {
				return this.element;
			});
		},

		showLabel: function(element, message) {
			var label = this.errorsFor( element );
			if ( label.length ) {
				// refresh error/success class
				label.removeClass().addClass( this.settings.errorClass );

				// check if we have a generated label, replace the message then
				label.attr("generated") && label.html(message);
			} else {
				// create label
				label = $("<" + this.settings.errorElement + "/>")
					.attr({"for":  this.idOrName(element), generated: true})
					.addClass(this.settings.errorClass)
					.html(message || "");
				if ( this.settings.wrapper ) {
					// make sure the element is visible, even in IE
					// actually showing the wrapped element is handled elsewhere
					label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
				}
				if ( !this.labelContainer.append(label).length )
					this.settings.errorPlacement
						? this.settings.errorPlacement(label, $(element) )
						: label.insertAfter(element);
			}
			if ( !message && this.settings.success ) {
				label.text("");
				typeof this.settings.success == "string"
					? label.addClass( this.settings.success )
					: this.settings.success( label );
			}
			this.toShow = this.toShow.add(label);
		},

		errorsFor: function(element) {
			var name = this.idOrName(element);
    		return this.errors().filter(function() {
				return $(this).attr('for') == name;
			});
		},

		idOrName: function(element) {
			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
		},

		checkable: function( element ) {
			return /radio|checkbox/i.test(element.type);
		},

		findByName: function( name ) {
			// select by name and filter by form for performance over form.find("[name=...]")
			var form = this.currentForm;
			return $(document.getElementsByName(name)).map(function(index, element) {
				return element.form == form && element.name == name && element  || null;
			});
		},

		getLength: function(value, element) {
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				return $("option:selected", element).length;
			case 'input':
				if( this.checkable( element) )
					return this.findByName(element.name).filter(':checked').length;
			}
			return value.length;
		},

		depend: function(param, element) {
			return this.dependTypes[typeof param]
				? this.dependTypes[typeof param](param, element)
				: true;
		},

		dependTypes: {
			"boolean": function(param, element) {
				return param;
			},
			"string": function(param, element) {
				return !!$(param, element.form).length;
			},
			"function": function(param, element) {
				return param(element);
			}
		},

		optional: function(element) {
			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
		},

		startRequest: function(element) {
			if (!this.pending[element.name]) {
				this.pendingRequest++;
				this.pending[element.name] = true;
			}
		},

		stopRequest: function(element, valid) {
			this.pendingRequest--;
			// sometimes synchronization fails, make sure pendingRequest is never < 0
			if (this.pendingRequest < 0)
				this.pendingRequest = 0;
			delete this.pending[element.name];
			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
				$(this.currentForm).submit();
				this.formSubmitted = false;
			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
				$(this.currentForm).triggerHandler("invalid-form", [this]);
				this.formSubmitted = false;
			}
		},

		previousValue: function(element) {
			return $.data(element, "previousValue") || $.data(element, "previousValue", {
				old: null,
				valid: true,
				message: this.defaultMessage( element, "remote" )
			});
		}

	},

	classRuleSettings: {
		required: {required: true},
		email: {email: true},
		url: {url: true},
		date: {date: true},
		dateISO: {dateISO: true},
		dateDE: {dateDE: true},
		number: {number: true},
		numberDE: {numberDE: true},
		digits: {digits: true},
		creditcard: {creditcard: true}
	},

	addClassRules: function(className, rules) {
		className.constructor == String ?
			this.classRuleSettings[className] = rules :
			$.extend(this.classRuleSettings, className);
	},

	classRules: function(element) {
		var rules = {};
		var classes = $(element).attr('class');
		classes && $.each(classes.split(' '), function() {
			if (this in $.validator.classRuleSettings) {
				$.extend(rules, $.validator.classRuleSettings[this]);
			}
		});
		return rules;
	},

	attributeRules: function(element) {
		var rules = {};
		var $element = $(element);

		for (var method in $.validator.methods) {
			var value = $element.attr(method);
			if (value) {
				rules[method] = value;
			}
		}

		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
			delete rules.maxlength;
		}

		return rules;
	},

	metadataRules: function(element) {
		if (!$.metadata) return {};

		var meta = $.data(element.form, 'validator').settings.meta;
		return meta ?
			$(element).metadata()[meta] :
			$(element).metadata();
	},

	staticRules: function(element) {
		var rules = {};
		var validator = $.data(element.form, 'validator');
		if (validator.settings.rules) {
			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
		}
		return rules;
	},

	normalizeRules: function(rules, element) {
		// handle dependency check
		$.each(rules, function(prop, val) {
			// ignore rule when param is explicitly false, eg. required:false
			if (val === false) {
				delete rules[prop];
				return;
			}
			if (val.param || val.depends) {
				var keepRule = true;
				switch (typeof val.depends) {
					case "string":
						keepRule = !!$(val.depends, element.form).length;
						break;
					case "function":
						keepRule = val.depends.call(element, element);
						break;
				}
				if (keepRule) {
					rules[prop] = val.param !== undefined ? val.param : true;
				} else {
					delete rules[prop];
				}
			}
		});

		// evaluate parameters
		$.each(rules, function(rule, parameter) {
			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
		});

		// clean number parameters
		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
			if (rules[this]) {
				rules[this] = Number(rules[this]);
			}
		});
		$.each(['rangelength', 'range'], function() {
			if (rules[this]) {
				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
			}
		});

		if ($.validator.autoCreateRanges) {
			// auto-create ranges
			if (rules.min && rules.max) {
				rules.range = [rules.min, rules.max];
				delete rules.min;
				delete rules.max;
			}
			if (rules.minlength && rules.maxlength) {
				rules.rangelength = [rules.minlength, rules.maxlength];
				delete rules.minlength;
				delete rules.maxlength;
			}
		}

		// To support custom messages in metadata ignore rule methods titled "messages"
		if (rules.messages) {
			delete rules.messages;
		}

		return rules;
	},

	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
	normalizeRule: function(data) {
		if( typeof data == "string" ) {
			var transformed = {};
			$.each(data.split(/\s/), function() {
				transformed[this] = true;
			});
			data = transformed;
		}
		return data;
	},

	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
	addMethod: function(name, method, message) {
		$.validator.methods[name] = method;
		$.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
		if (method.length < 3) {
			$.validator.addClassRules(name, $.validator.normalizeRule(name));
		}
	},

	methods: {

		// http://docs.jquery.com/Plugins/Validation/Methods/required
		required: function(value, element, param) {
			// check if dependency is met
			if ( !this.depend(param, element) )
				return "dependency-mismatch";
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				// could be an array for select-multiple or a string, both are fine this way
				var val = $(element).val();
				return val && val.length > 0;
			case 'input':
				if ( this.checkable(element) )
					return this.getLength(value, element) > 0;
			default:
				return $.trim(value).length > 0;
			}
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/remote
		remote: function(value, element, param) {
			if ( this.optional(element) )
				return "dependency-mismatch";

			var previous = this.previousValue(element);
			if (!this.settings.messages[element.name] )
				this.settings.messages[element.name] = {};
			previous.originalMessage = this.settings.messages[element.name].remote;
			this.settings.messages[element.name].remote = previous.message;

			param = typeof param == "string" && {url:param} || param;

			if ( this.pending[element.name] ) {
				return "pending";
			}
			if ( previous.old === value ) {
				return previous.valid;
			}

			previous.old = value;
			var validator = this;
			this.startRequest(element);
			var data = {};
			data[element.name] = value;
			$.ajax($.extend(true, {
				url: param,
				mode: "abort",
				port: "validate" + element.name,
				dataType: "json",
				data: data,
				success: function(response) {
					validator.settings.messages[element.name].remote = previous.originalMessage;
					var valid = response === true;
					if ( valid ) {
						var submitted = validator.formSubmitted;
						validator.prepareElement(element);
						validator.formSubmitted = submitted;
						validator.successList.push(element);
						validator.showErrors();
					} else {
						var errors = {};
						var message = response || validator.defaultMessage( element, "remote" );
						errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
						validator.showErrors(errors);
					}
					previous.valid = valid;
					validator.stopRequest(element, valid);
				}
			}, param));
			return "pending";
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
		minlength: function(value, element, param) {
			return this.optional(element) || this.getLength($.trim(value), element) >= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
		maxlength: function(value, element, param) {
			return this.optional(element) || this.getLength($.trim(value), element) <= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
		rangelength: function(value, element, param) {
			var length = this.getLength($.trim(value), element);
			return this.optional(element) || ( length >= param[0] && length <= param[1] );
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/min
		min: function( value, element, param ) {
			return this.optional(element) || value >= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/max
		max: function( value, element, param ) {
			return this.optional(element) || value <= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/range
		range: function( value, element, param ) {
			return this.optional(element) || ( value >= param[0] && value <= param[1] );
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/email
		email: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/url
		url: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/date
		date: function(value, element) {
			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
		dateISO: function(value, element) {
			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/number
		number: function(value, element) {
			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/digits
		digits: function(value, element) {
			return this.optional(element) || /^\d+$/.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
		// based on http://en.wikipedia.org/wiki/Luhn
		creditcard: function(value, element) {
			if ( this.optional(element) )
				return "dependency-mismatch";
			// accept only digits and dashes
			if (/[^0-9-]+/.test(value))
				return false;
			var nCheck = 0,
				nDigit = 0,
				bEven = false;

			value = value.replace(/\D/g, "");

			for (var n = value.length - 1; n >= 0; n--) {
				var cDigit = value.charAt(n);
				var nDigit = parseInt(cDigit, 10);
				if (bEven) {
					if ((nDigit *= 2) > 9)
						nDigit -= 9;
				}
				nCheck += nDigit;
				bEven = !bEven;
			}

			return (nCheck % 10) == 0;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/accept
		accept: function(value, element, param) {
			param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
		equalTo: function(value, element, param) {
			// bind to the blur event of the target in order to revalidate whenever the target field is updated
			// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
			var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
				$(element).valid();
			});
			return value == target.val();
		}

	}

});

// deprecated, use $.validator.format instead
$.format = $.validator.format;

})(jQuery);

// ajax mode: abort
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
;(function($) {
	var pendingRequests = {};
	// Use a prefilter if available (1.5+)
	if ( $.ajaxPrefilter ) {
		$.ajaxPrefilter(function(settings, _, xhr) {
			var port = settings.port;
			if (settings.mode == "abort") {
				if ( pendingRequests[port] ) {
					pendingRequests[port].abort();
				}
				pendingRequests[port] = xhr;
			}
		});
	} else {
		// Proxy ajax
		var ajax = $.ajax;
		$.ajax = function(settings) {
			var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
				port = ( "port" in settings ? settings : $.ajaxSettings ).port;
			if (mode == "abort") {
				if ( pendingRequests[port] ) {
					pendingRequests[port].abort();
				}
				return (pendingRequests[port] = ajax.apply(this, arguments));
			}
			return ajax.apply(this, arguments);
		};
	}
})(jQuery);

// provides cross-browser focusin and focusout events
// IE has native support, in other browsers, use event caputuring (neither bubbles)

// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
;(function($) {
	// only implement if not provided by jQuery core (since 1.4)
	// TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
	if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
		$.each({
			focus: 'focusin',
			blur: 'focusout'
		}, function( original, fix ){
			$.event.special[fix] = {
				setup:function() {
					this.addEventListener( original, handler, true );
				},
				teardown:function() {
					this.removeEventListener( original, handler, true );
				},
				handler: function(e) {
					arguments[0] = $.event.fix(e);
					arguments[0].type = fix;
					return $.event.handle.apply(this, arguments);
				}
			};
			function handler(e) {
				e = $.event.fix(e);
				e.type = fix;
				return $.event.handle.call(this, e);
			}
		});
	};
	$.extend($.fn, {
		validateDelegate: function(delegate, type, handler) {
			return this.bind(type, function(event) {
				var target = $(event.target);
				if (target.is(delegate)) {
					return handler.apply(target, arguments);
				}
			});
		}
	});
})(jQuery);

///* ncjjquery.popupWindow.js */
(function($){ 		  
	$.fn.popupWindow = function(instanceSettings){
		
		return this.each(function(){
		
		$(this).click(function(){
		
		$.fn.popupWindow.defaultSettings = {
			centerBrowser:0, // center window over browser window? {1 (YES) or 0 (NO)}. overrides top and left
			centerScreen:0, // center window over entire screen? {1 (YES) or 0 (NO)}. overrides top and left
			height:500, // sets the height in pixels of the window.
			left:0, // left position when the window appears.
			location:0, // determines whether the address bar is displayed {1 (YES) or 0 (NO)}.
			menubar:0, // determines whether the menu bar is displayed {1 (YES) or 0 (NO)}.
			resizable:0, // whether the window can be resized {1 (YES) or 0 (NO)}. Can also be overloaded using resizable.
			scrollbars:0, // determines whether scrollbars appear on the window {1 (YES) or 0 (NO)}.
			status:0, // whether a status line appears at the bottom of the window {1 (YES) or 0 (NO)}.
			width:500, // sets the width in pixels of the window.
			windowName:null, // name of window set from the name attribute of the element that invokes the click
			windowURL:null, // url used for the popup
			top:0, // top position when the window appears.
			toolbar:0 // determines whether a toolbar (includes the forward and back buttons) is displayed {1 (YES) or 0 (NO)}.
		};
		
		settings = $.extend({}, $.fn.popupWindow.defaultSettings, instanceSettings || {});
		
		var windowFeatures =    'height=' + settings.height +
								',width=' + settings.width +
								',toolbar=' + settings.toolbar +
								',scrollbars=' + settings.scrollbars +
								',status=' + settings.status + 
								',resizable=' + settings.resizable +
								',location=' + settings.location +
								',menuBar=' + settings.menubar;

				settings.windowName = this.name || settings.windowName;
				settings.windowURL = settings.windowURL?settings.windowURL:this.href;
				var centeredY,centeredX;
			
				if(settings.centerBrowser){
						
					if ($.browser.msie) {//hacked together for IE browsers
						centeredY = (window.screenTop - 120) + ((((document.documentElement.clientHeight + 120)/2) - (settings.height/2)));
						centeredX = window.screenLeft + ((((document.body.offsetWidth + 20)/2) - (settings.width/2)));
					}else{
						centeredY = window.screenY + (((window.outerHeight/2) - (settings.height/2)));
						centeredX = window.screenX + (((window.outerWidth/2) - (settings.width/2)));
					}
					window.open(settings.windowURL, settings.windowName, windowFeatures+',left=' + centeredX +',top=' + centeredY).focus();
				}else if(settings.centerScreen){
					centeredY = (screen.height - settings.height)/2;
					centeredX = (screen.width - settings.width)/2;
					window.open(settings.windowURL, settings.windowName, windowFeatures+',left=' + centeredX +',top=' + centeredY).focus();
				}else{
					window.open(settings.windowURL, settings.windowName, windowFeatures+',left=' + settings.left +',top=' + settings.top).focus();	
				}
				return false;
			});
			
		});	
	};
})(jQuery);

///* cjjquery.colorbox.js */
// ColorBox v1.3.16 - a full featured, light-weight, customizable lightbox based on jQuery 1.3+
// Copyright (c) 2011 Jack Moore - jack@colorpowered.com
// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
(function ($, document, window) {
	var
	// ColorBox Default Settings.	
	// See http://colorpowered.com/colorbox for details.
	defaults = {
		transition: "elastic",
		speed: 300,
		width: false,
		initialWidth: "600",
		innerWidth: false,
		maxWidth: false,
		height: false,
		initialHeight: "450",
		innerHeight: false,
		maxHeight: false,
		scalePhotos: true,
		scrolling: true,
		inline: false,
		html: false,
		iframe: false,
		fastIframe: true,
		photo: false,
		href: false,
		title: false,
		rel: false,
		opacity: 0.9,
		preloading: true,
		current: "image {current} of {total}",
		previous: "previous",
		next: "next",
		showClose: true,
		close: "close",
		open: false,
		returnFocus: true,
		loop: true,
		slideshow: false,
		slideshowAuto: true,
		slideshowSpeed: 2500,
		slideshowStart: "start slideshow",
		slideshowStop: "stop slideshow",
		onOpen: false,
		onLoad: false,
		onComplete: false,
		onCleanup: false,
		onClosed: false,
		overlayClose: true,		
		escKey: true,
		arrowKey: true
	},
	
	// Abstracting the HTML and event identifiers for easy rebranding
	colorbox = 'colorbox',
	prefix = 'cbox',
	
	// Events	
	event_open = prefix + '_open',
	event_load = prefix + '_load',
	event_complete = prefix + '_complete',
	event_cleanup = prefix + '_cleanup',
	event_closed = prefix + '_closed',
	event_purge = prefix + '_purge',
	event_loaded = prefix + '_loaded',
	
	// Special Handling for IE
	isIE = $.browser.msie && !$.support.opacity, // feature detection alone gave a false positive on at least one phone browser and on some development versions of Chrome.
	isIE6 = isIE && $.browser.version < 7,
	event_ie6 = prefix + '_IE6',

	// Cached jQuery Object Variables
	$overlay,
	$box,
	$wrap,
	$content,
	$topBorder,
	$leftBorder,
	$rightBorder,
	$bottomBorder,
	$related,
	$window,
	$loaded,
	$loadingBay,
	$loadingOverlay,
	$title,
	$current,
	$slideshow,
	$next,
	$prev,
	$close,
	$groupControls,

	// Variables for cached values or use across multiple functions
	settings = {},
	interfaceHeight,
	interfaceWidth,
	loadedHeight,
	loadedWidth,
	element,
	index,
	photo,
	open,
	active,
	closing = false,
	
	publicMethod,
	boxElement = prefix + 'Element';
	
	// ****************
	// HELPER FUNCTIONS
	// ****************

	// jQuery object generator to reduce code size
	function $div(id, cssText) { 
		var div = document.createElement('div');
		if (id) {
                        div.id = prefix + id;
                }
		div.style.cssText = cssText || false;
		return $(div);
	}

	// Convert % values to pixels
	function setSize(size, dimension) {
		dimension = dimension === 'x' ? $window.width() : $window.height();
		return (typeof size === 'string') ? Math.round((/%/.test(size) ? (dimension / 100) * parseInt(size, 10) : parseInt(size, 10))) : size;
	}
	
	// Checks an href to see if it is a photo.
	// There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
	function isImage(url) {
		return settings.photo || /\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i.test(url);
	}
	
	// Assigns function results to their respective settings.  This allows functions to be used as values.
	function process(settings) {
		for (var i in settings) {
			if ($.isFunction(settings[i]) && i.substring(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
			    settings[i] = settings[i].call(element);
			}
		}
		settings.rel = settings.rel || element.rel || 'nofollow';
		settings.href = $.trim(settings.href || $(element).attr('href'));
		settings.title = settings.title || element.title;
	}

	function trigger(event, callback) {
		if (callback) {
			callback.call(element);
		}
		$.event.trigger(event);
	}

	// Slideshow functionality
	function slideshow() {
		var
		timeOut,
		className = prefix + "Slideshow_",
		click = "click." + prefix,
		start,
		stop,
		clear;
		
		if (settings.slideshow && $related[1]) {
			start = function () {
				$slideshow
					.text(settings.slideshowStop)
					.unbind(click)
					.bind(event_complete, function () {
						if (index < $related.length - 1 || settings.loop) {
							timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
						}
					})
					.bind(event_load, function () {
						clearTimeout(timeOut);
					})
					.one(click + ' ' + event_cleanup, stop);
				$box.removeClass(className + "off").addClass(className + "on");
				timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
			};
			
			stop = function () {
				clearTimeout(timeOut);
				$slideshow
					.text(settings.slideshowStart)
					.unbind([event_complete, event_load, event_cleanup, click].join(' '))
					.one(click, start);
				$box.removeClass(className + "on").addClass(className + "off");
			};
			
			if (settings.slideshowAuto) {
				start();
			} else {
				stop();
			}
		}
	}

    function close_setup() {
        if (settings.showClose)
		{
			$close.html(settings.close).show();
		} else {
			$close.hide();
		}
    }
	function launch(elem) {
		if (!closing) {
			
			element = elem;
			
			process($.extend(settings, $.data(element, colorbox)));
			
			$related = $(element);
			
			index = 0;
			
			if (settings.rel !== 'nofollow') {
				$related = $('.' + boxElement).filter(function () {
					var relRelated = $.data(this, colorbox).rel || this.rel;
					return (relRelated === settings.rel);
				});
				index = $related.index(element);
				
				// Check direct calls to ColorBox.
				if (index === -1) {
					$related = $related.add(element);
					index = $related.length - 1;
				}
			}
			
			if (!open) {
				open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
				
				$box.show();
				
				if (settings.returnFocus) {
					try {
						element.blur();
						$(element).one(event_closed, function () {
							try {
								this.focus();
							} catch (e) {
								// do nothing
							}
						});
					} catch (e) {
						// do nothing
					}
				}
				
				// +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5'
				$overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();
				
				// Opens inital empty ColorBox prior to content being loaded.
				settings.w = setSize(settings.initialWidth, 'x');
				settings.h = setSize(settings.initialHeight, 'y');
				publicMethod.position(0);
				
				if (isIE6) {
					$window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
						$overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
					}).trigger('resize.' + event_ie6);
				}
				
				trigger(event_open, settings.onOpen);
				
				$groupControls.add($title).hide();
				close_setup();

			}
			
			publicMethod.load(true);
		}
	}

	// ****************
	// PUBLIC FUNCTIONS
	// Usage format: $.fn.colorbox.close();
	// Usage from within an iframe: parent.$.fn.colorbox.close();
	// ****************
	
	publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
		var $this = this, autoOpen;
		
		if (!$this[0] && $this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
			return $this;
		}
		
		options = options || {};
		
		if (callback) {
			options.onComplete = callback;
		}
		
		if (!$this[0] || $this.selector === undefined) { // detects $.colorbox() and $.fn.colorbox()
			$this = $('<a/>');
			options.open = true; // assume an immediate open
		}
        var originalOnComplete = options.onComplete;
        options.onComplete = function () {
            $this.colorbox.resize();
            if ('function' === typeof originalOnComplete) {
                originalOnComplete.call(this);
            }
        }
		$this.each(function () {
			$.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
			$(this).addClass(boxElement);
		});
		
		autoOpen = options.open;
		
		if ($.isFunction(autoOpen)) {
			autoOpen = autoOpen.call($this);
		}
		
		if (autoOpen) {
			launch($this[0]);
		}
		
		return $this;
	};

	// Initialize ColorBox: store common calculations, preload the interface graphics, append the html.
	// This preps colorbox for a speedy open when clicked, and lightens the burdon on the browser by only
	// having to run once, instead of each time colorbox is opened.
	publicMethod.init = function () {
		// Create & Append jQuery Objects
		$window = $(window);
		$box = $div().attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''});
		$overlay = $div("Overlay", isIE6 ? 'position:absolute' : '').hide();
		
		$wrap = $div("Wrapper");
		$content = $div("Content").append(
			$loaded = $div("LoadedContent", 'width:0; height:0; overflow:hidden'),
			$loadingOverlay = $div("LoadingOverlay").add($div("LoadingGraphic")),
			$title = $div("Title"),
			$current = $div("Current"),
			$next = $div("Next"),
			$prev = $div("Previous"),
			$slideshow = $div("Slideshow").bind(event_open, slideshow),
			$close = $div("Close")
		);
		$wrap.append( // The 3x3 Grid that makes up ColorBox
			$div().append(
				$div("TopLeft"),
				$topBorder = $div("TopCenter"),
				$div("TopRight")
			),
			$div(false, 'clear:left').append(
				$leftBorder = $div("MiddleLeft"),
				$content,
				$rightBorder = $div("MiddleRight")
			),
			$div(false, 'clear:left').append(
				$div("BottomLeft"),
				$bottomBorder = $div("BottomCenter"),
				$div("BottomRight")
			)
		).children().children().css({'float': 'left'});
		
		$loadingBay = $div(false, 'position:absolute; width:9999px; visibility:hidden; display:none');
		
		$('body').prepend($overlay, $box.append($wrap, $loadingBay));
		
		$content.children()
		.hover(function () {
			$(this).addClass('hover');
		}, function () {
			$(this).removeClass('hover');
		}).addClass('hover');
		
		// Cache values needed for size calculations
		interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
		interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
		loadedHeight = $loaded.outerHeight(true);
		loadedWidth = $loaded.outerWidth(true);
		// Setting padding to remove the need to do size conversions during the animation step.
		$box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();
		
		// Setup button events.
                $next.click(function () {
                        publicMethod.next();
                });
                $prev.click(function () {
                        publicMethod.prev();
                });
                $close.click(function () {
                        publicMethod.close();
                });
                $('.close_colorbox_dialog').click(function () {
                        publicMethod.close();
                        return false;
                });
		
		$groupControls = $next.add($prev).add($current).add($slideshow);
		
		// Adding the 'hover' class allowed the browser to load the hover-state
		// background graphics.  The class can now can be removed.
		$content.children().removeClass('hover');
		
		$('.' + boxElement).live('click', function (e) {
			// checks to see if it was a non-left mouse-click and for clicks modified with ctrl, shift, or alt.
			if (!((e.button !== 0 && typeof e.button !== 'undefined') || e.ctrlKey || e.shiftKey || e.altKey)) {
				e.preventDefault();
				launch(this);
			}
		});
		
		$overlay.click(function () {
			if (settings.overlayClose) {
				publicMethod.close();
			}
		});
		
		// Set Navigation Key Bindings
		$(document).bind('keydown.' + prefix, function (e) {
                        var key = e.keyCode;
			if (open && settings.escKey && key === 27) {
				e.preventDefault();
				publicMethod.close();
			}
			if (open && settings.arrowKey && $related[1]) {
				if (key === 37) {
					e.preventDefault();
					$prev.click();
				} else if (key === 39) {
					e.preventDefault();
					$next.click();
				}
			}
		});
	};
	
	publicMethod.remove = function () {
		$box.add($overlay).remove();
		$('.' + boxElement).die('click').removeData(colorbox).removeClass(boxElement);
	};

	publicMethod.position = function (speed, loadedCallback) {
		var
		animate_speed,
		// keeps the top and left positions within the browser's viewport.
		posTop = Math.max(document.documentElement.clientHeight - settings.h - loadedHeight - interfaceHeight, 0) / 2 + $window.scrollTop(),
		posLeft = Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2 + $window.scrollLeft();
		
		// setting the speed to 0 to reduce the delay between same-sized content.
		animate_speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed;
		
		// this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
		// but it has to be shrank down around the size of div#colorbox when it's done.  If not,
		// it can invoke an obscure IE bug when using iframes.
		$wrap[0].style.width = $wrap[0].style.height = "9999px";
		
        // don't change window position if our popup more then window
        if (document.documentElement.clientHeight < settings.h) {
            posTop = $box.css('top');
        }
		function modalDimensions(that) {
			// loading overlay height has to be explicitly set for IE6.
			$topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
			$loadingOverlay[0].style.height = $loadingOverlay[1].style.height = $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
		}
		
        $close.hide();
		$box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: posTop, left: posLeft}, {
			duration: animate_speed,
			complete: function () {
				modalDimensions(this);
				
				active = false;
				
				// shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
				$wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
				$wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
				
				if (loadedCallback) {
					loadedCallback();
				}
                if ('hidden' === $(this).css('overflow')){
				    $(this).css('overflow', 'visible');
				}
                close_setup();
			},
			step: function () {
				modalDimensions(this);
			}
		});
	};

	publicMethod.resize = function (options) {
		if (open) {
			options = options || {};
			
			if (options.width) {
				settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
			}
			if (options.innerWidth) {
				settings.w = setSize(options.innerWidth, 'x');
			}
			$loaded.css({width: settings.w});
			
			if (options.height) {
				settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
			}
			if (options.innerHeight) {
				settings.h = setSize(options.innerHeight, 'y');
			}
			if (!options.innerHeight && !options.height) {				
                var $sdiv = $('<div style="width:0px;height:0px;"></div>');
                $sdiv.appendTo($loaded.parent());
                var $lclone = $loaded.clone().appendTo($sdiv);
                var $child = $lclone.wrapInner("<div style='overflow:auto'></div>").children(); // temporary wrapper to get an accurate estimate of just how high the total content should be.
				settings.h = $child.height();
				$lclone.remove();
                $sdiv.remove();
                
                /*var $lclone = $loaded.clone().appendTo($loaded.parent());
                var $child = $lclone.wrapInner("<div style='overflow:auto'></div>").children(); // temporary wrapper to get an accurate estimate of just how high the total content should be.
				settings.h = $child.height();
				$lclone.remove();*/
				
                //var $child = $loaded.wrapInner("<div style='overflow:auto'></div>").children(); // temporary wrapper to get an accurate estimate of just how high the total content should be.
//				settings.h = $child.height();
//				$child.replaceWith($child.children()); // ditch the temporary wrapper div used in height calculation
			}
			$loaded.css({height: settings.h});
			
			publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
		}
	};

	publicMethod.prep = function (object) {
		if (!open) {
			return;
		}
		
		var speed = settings.transition === "none" ? 0 : settings.speed;
		
		$window.unbind('resize.' + prefix);
		$loaded.remove();
		$loaded = $div('LoadedContent').html(object);
		
		function getWidth() {
			settings.w = settings.w || $loaded.width();
			settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
			return settings.w;
		}
		function getHeight() {
			settings.h = settings.h || $loaded.height();
			settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
			return settings.h;
		}
		$loaded.hide()
		.appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
		.css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
		.css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
		.prependTo($content);
		$loadingBay.hide();
		
		// floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
		//$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
		
                $(photo).css({'float': 'none'});
		
		// Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay.
		if (isIE6) {
			$('select').not($box.find('select')).filter(function () {
				return this.style.visibility !== 'hidden';
			}).css({'visibility': 'hidden'}).one(event_cleanup, function () {
				this.style.visibility = 'inherit';
			});
		}
				
		function setPosition(s) {
			publicMethod.position(s, function () {
				var prev, prevSrc, next, nextSrc, total = $related.length, iframe, complete;
				
				if (!open) {
					return;
				}
				
				complete = function () {
					$loadingOverlay.hide();
					trigger(event_complete, settings.onComplete);
				};
				
				if (isIE) {
					//This fadeIn helps the bicubic resampling to kick-in.
					if (photo) {
						$loaded.fadeIn(100);
					}
				}
				
				$title.html(settings.title).add($loaded).show();
				
				if (total > 1) { // handle grouping
					if (typeof settings.current === "string") {
						$current.html(settings.current.replace(/\{current\}/, index + 1).replace(/\{total\}/, total)).show();
					}
					
					$next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
					$prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
					
					prev = index ? $related[index - 1] : $related[total - 1];
					next = index < total - 1 ? $related[index + 1] : $related[0];
					
					if (settings.slideshow) {
						$slideshow.show();
					}
					
					// Preloads images within a rel group
					if (settings.preloading) {
						nextSrc = $.data(next, colorbox).href || next.href;
						prevSrc = $.data(prev, colorbox).href || prev.href;
						
						nextSrc = $.isFunction(nextSrc) ? nextSrc.call(next) : nextSrc;
						prevSrc = $.isFunction(prevSrc) ? prevSrc.call(prev) : prevSrc;
						
						if (isImage(nextSrc)) {
							$('<img/>')[0].src = nextSrc;
						}
						
						if (isImage(prevSrc)) {
							$('<img/>')[0].src = prevSrc;
						}
					}
				} else {
					$groupControls.hide();
				}
				
				if (settings.iframe) {
					iframe = $('<iframe/>').addClass(prefix + 'Iframe')[0];
					
					if (settings.fastIframe) {
						complete();
					} else {
						$(iframe).load(complete);
					}
					iframe.name = prefix + (+new Date());
					iframe.src = settings.href;
					
					if (!settings.scrolling) {
						iframe.scrolling = "no";
					}
					
					if (isIE) {
                                                iframe.frameborder=0;
						iframe.allowTransparency = "true";
				}
				
					$(iframe).appendTo($loaded).one(event_purge, function () {
						iframe.src = "//about:blank";
					});
				} else {
					complete();
				}
				
				if (settings.transition === 'fade') {
					$box.fadeTo(speed, 1, function () {
						$box[0].style.filter = "";
					});
				} else {
                                        $box[0].style.filter = "";
				}
				
				$window.bind('resize.' + prefix, function () {
					publicMethod.position(0);
				});
			});
		}
		
		if (settings.transition === 'fade') {
			$box.fadeTo(speed, 0, function () {
				setPosition(0);
			});
		} else {
			setPosition(speed);
		}
	};

	publicMethod.load = function (launched) {
		var href, setResize, prep = publicMethod.prep;
		
		active = true;
		
		photo = false;
		
		element = $related[index];
		
		if (!launched) {
			process($.extend(settings, $.data(element, colorbox)));
		}
		
		trigger(event_purge);
		
		trigger(event_load, settings.onLoad);
		
		settings.h = settings.height ?
				setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
				settings.innerHeight && setSize(settings.innerHeight, 'y');
		
		settings.w = settings.width ?
				setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
				settings.innerWidth && setSize(settings.innerWidth, 'x');
		
		// Sets the minimum dimensions for use in image scaling
		settings.mw = settings.w;
		settings.mh = settings.h;
		
		// Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
		// If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
		if (settings.maxWidth) {
			settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
			settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
		}
		if (settings.maxHeight) {
			settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
			settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
		}
		
		href = settings.href;
		
		$loadingOverlay.show();

		if (settings.inline) {
			// Inserts an empty placeholder where inline content is being pulled from.
			// An event is bound to put inline content back when ColorBox closes or loads new content.
			$div().hide().insertBefore($(href)[0]).one(event_purge, function () {
				$(this).replaceWith($loaded.children());
			});
			prep($(href));
		} else if (settings.iframe) {
			// IFrame element won't be added to the DOM until it is ready to be displayed,
			// to avoid problems with DOM-ready JS that might be trying to run in that iframe.
			prep(" ");
		} else if (settings.html) {
			prep(settings.html);
		} else if (isImage(href)) {
			$(photo = new Image())
			.addClass(prefix + 'Photo')
			.error(function () {
				settings.title = false;
				prep($div('Error').text('This image could not be loaded'));
			})
			.load(function () {
				var percent;
				photo.onload = null; //stops animated gifs from firing the onload repeatedly.
				
				if (settings.scalePhotos) {
					setResize = function () {
						photo.height -= photo.height * percent;
						photo.width -= photo.width * percent;	
					};
					if (settings.mw && photo.width > settings.mw) {
						percent = (photo.width - settings.mw) / photo.width;
						setResize();
					}
					if (settings.mh && photo.height > settings.mh) {
						percent = (photo.height - settings.mh) / photo.height;
						setResize();
					}
				}
				
				if (settings.h) {
					photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px';
				}
				
				if ($related[1] && (index < $related.length - 1 || settings.loop)) {
					photo.style.cursor = 'pointer';
					photo.onclick = function () {
                                                publicMethod.next();
                                        };
				}
				
				if (isIE) {
					photo.style.msInterpolationMode = 'bicubic';
				}
				
				setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
					prep(photo);
				}, 1);
			});
			
			setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
				photo.src = href;
			}, 1);	
		} else if (href) {
			$loadingBay.load(href, function (data, status, xhr) {
				prep(status === 'error' ? $div('Error').text('Request unsuccessful: ' + xhr.statusText) : $(this).contents());
			});
		}
	};

	// Navigates to the next page/image in a set.
	publicMethod.next = function () {
		if (!active && $related[1] && (index < $related.length - 1 || settings.loop)) {
			index = index < $related.length - 1 ? index + 1 : 0;
			publicMethod.load();
		}
	};
	
	publicMethod.prev = function () {
		if (!active && $related[1] && (index || settings.loop)) {
			index = index ? index - 1 : $related.length - 1;
			publicMethod.load();
		}
	};

	// Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
	publicMethod.close = function () {
		if (open && !closing) {
			
			closing = true;
			
			open = false;
			
			trigger(event_cleanup, settings.onCleanup);
			
			$window.unbind('.' + prefix + ' .' + event_ie6);
			
			$overlay.fadeTo(200, 0);
			
			$box.stop().fadeTo(300, 0, function () {
                                
				$box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
				
				trigger(event_purge);
				
				$loaded.remove();
				
				setTimeout(function () {
					closing = false;
					trigger(event_closed, settings.onClosed);
				}, 1);
			});
		}
	};

	// A method for fetching the current element ColorBox is referencing.
	// returns a jQuery object.
	publicMethod.element = function () {
		return $(element);
	};

	publicMethod.settings = defaults;

	// Initializes ColorBox when the DOM has loaded
	$(publicMethod.init);

}(jQuery, document, this));
///* cjShare.js */
if (!window.Share) {
    Share = {
        event_id: 0,
        results: {},
        URLdata: [],
        petition_id: false,
        resetUrls: function () {
            this.urls = {};
            this.urlsA = [];
        },
        addQS: function (d, c) {
            var a = [];
            for (var b in c) if (c[b]) a.push(b.toString() + '=' + encodeURIComponent(c[b]));
            return d + '?' + a.join('&');
        },
        getUrl: function (a) {
            return a.getAttribute('share_url') || window.location.href;
        },
        getType: function (a) {
            return a.getAttribute('type') || 'button_count';
        },
        pretty: function (a) {
            return a >= 1e+07 ? Math.round(a / 1e+06) + 'M' : (a >= 10000 ? Math.round(a / 1000) + 'K' : a);
        },
        updateButton: function (a) {
            var cid = $(a).attr('sharecid');
            var type = $(a).attr('sharetype');
            for(h in this.results[cid]) {
                if (this.results[cid]) {
                    a[type +'_count'] = this.results[cid][type +'_count'];
                } else {
                    a[type +'_count'] = 0;
                }
                this.displayBox(a, 0);
            }

        },
        getWindowInnerSize: function() {
          var width = 0;
          var height = 0;
          var elem = null;
          if ('innerWidth' in window) {
            // For non-IE
            width = window.innerWidth;
            height = window.innerHeight;
          } else {
            // For IE,
            if (('BackCompat' === window.document.compatMode)
                && ('body' in window.document)) {
                elem = window.document.body;
            } else if ('documentElement' in window.document) {
              elem = window.document.documentElement;
            }
            if (elem !== null) {
              width = elem.offsetWidth;
              height = elem.offsetHeight;
            }
          }
          return [width, height];
        },
        getParentCoords: function() {
          var width = 0;
          var height = 0;
          if ('screenLeft' in window) {
            // IE-compatible variants
            width = window.screenLeft;
            height = window.screenTop;
          } else if ('screenX' in window) {
            // Firefox-compatible
            width = window.screenX;
            height = window.screenY;
          }
          return [width, height];
        },
        getCenteredCoords: function(width, height) {
           var parentSize = this.getWindowInnerSize();
           var parentPos = this.getParentCoords();
           var xPos = parentPos[0] +
               Math.max(0, Math.floor((parentSize[0] - width) / 2));
           var yPos = parentPos[1] +
               Math.max(0, Math.floor((parentSize[1] - height) / 2));
           return [xPos, yPos];
        },
        displayBox: function (a, d) {
            var type = $(a).attr('sharetype');
            if (typeof(a[type +'_count']) == 'number' && a[type +'_count'] >= d) {
                $('.' + $(a).attr('sharetype') + '_share_counter_' + $(a).attr('sharecid')).each(function(){$(this).html(Share.pretty(a[type +'_count']))});
            }
        },
        addEvent: function(href) {
			if ('undefined' !== typeof rsvp_event_id) {
				return href + '&id=' + rsvp_event_id + '';
            }
            return href;
        },
        renderButton: function (c) {
            var cid = $(c).attr('sharecid');
            var type = $(c).attr('sharetype');
            var lang = $(c).attr('sharelang');
            var href = $(c).attr('href');
            var method = $(c).attr('sharemethod');
            if (!method) {
                method = 'stream.publish';
            }
            /***************************FACEBOOK**************************/
            var global_response = null;

            var stream_callback = function (post) {
                FB.getLoginStatus(
                    function(response) {
                        if (response.session) {
                            //login_response(response);
                    var a = document.createElement('script');
                    if ('undefined' !== typeof post && null !== post && post.post_id) {
                        var send_data = {
                            action: 'save_share_counter',
                            cid: cid,
                            lang: lang,
                            random: Math.random(),
                            value: 'shared',
                            fb_uid: response.session.uid
                        };
                        if (Share.petition_id) {
                            send_data.petition_id = Share.petition_id;
                        }
                        a.src = Share.addQS('/act/facebook.php', send_data);
                    } else {
                        var send_data = {
                            action: 'save_share_counter',
                            cid: cid,
                            lang: lang,
                            random: Math.random(),
                            value: 'closed',
                                    fb_uid: response.session.uid
                        };
                        if (Share.petition_id) {
                            send_data.petition_id = Share.petition_id;
                        }
                        a.src = Share.addQS('/act/facebook.php', send_data);
                    }
                    Share.insert(a);
                        } else {
                            //FB.login(login_response);
                        }
                    }
                );
            }
            var facebook_click = function () {
                    if (!c.fb_clicked) {
                        c.facebook_count += 1;
                        c.fb_clicked = true;
                    }
                    var send_data = {
                        action: 'save_share_counter',
                        cid: cid,
                        lang: lang,
                        random: Math.random(),
                        value: 'clicked'
                    };
                    if (Share.petition_id) {
                        send_data.petition_id = Share.petition_id;
                    }
                    var sclick = document.createElement('script');
                    sclick.src = Share.addQS('/act/facebook.php', send_data);

                    Share.insert(sclick);

                    var login_response = function(response){
                        if (response.session){
                            var send_data = {
                                action: 'save_share_counter',
                                cid: cid,
                                lang: lang,
                                random: Math.random(),
                                value: 'user_clicked',
                                fb_uid: response.session.uid
                            };
                            if (Share.petition_id) {
                                send_data.petition_id = Share.petition_id;
                            }
                            var suclick = document.createElement('script');
                            suclick.src = Share.addQS('/act/facebook.php', send_data);

                            Share.insert(suclick);

                            global_response = response;

                            /*FB.ui(
                                {
                                    display: 'popup',
                                    method: 'stream.publish',
                                    attachment: share_data[cid].facebook,
                                    action_links: share_data[cid].facebook.action_links
                                },
                                stream_callback
                            );*/
                        }

                    }
                    /***************** RELOAD FACEBOOK POPUP *************************/
					FB.UIServer.popup = function (b) {
						var a = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
							i = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
							g = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.documentElement.clientWidth,
							f = typeof window.outerHeight != 'undefined' ? window.outerHeight : (document.documentElement.clientHeight - 22),
							k = b.size.width,
							d = b.size.height,
							h = (a < 0) ? window.screen.width + a : a,
							e = parseInt(h + ((g - k) / 2), 10),
							j = parseInt(i + ((f - d) / 2.5), 10),
							c = ('width=' + k + ',height=' + d + ',left=' + e + ',top=' + j + ',scrollbars=1');
						if (g > window.screen.width) {
							e = parseInt(((g - k) / 2), 10);
							c = ('width=' + k + ',height=' + d + ',left=' + e + ',top=' + j);
                	    }
						if (b.name && (b.name == 'permissions.request' || b.name == 'permissions.oauth')) c += ',location=1,toolbar=0';
						if (b.post) {
							FB.UIServer.setLoadedNode(b, window.open('about:blank', b.id, c));
							FB.Content.submitToTarget({
								url: b.url,
								target: b.id,
								params: b.params
							});
						} else FB.UIServer.setLoadedNode(b, window.open(b.url, b.id, c));
						if (b.id in FB.UIServer._defaultCb) FB.UIServer._popupMonitor();
					}
                    /*FB.UIServer.popup = function (b) {
                        var a = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
                            i = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
                            g = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.documentElement.clientWidth,
                            f = typeof window.outerHeight != 'undefined' ? window.outerHeight : (document.documentElement.clientHeight - 22),
                            k = b.size.width,
                            d = b.size.height,
                            h = (a < 0) ? window.screen.width + a : a,
                            e = parseInt(h + ((g - k) / 2), 10),
                            j = parseInt(i + ((f - d) / 2.5), 10),
                            c = ('width=' + k + ',height=' + d + ',left=' + e + ',top=' + j);
                	    if (g > window.screen.width) {
							e = parseInt(((g - k) / 2), 10);
							c = ('width=' + k + ',height=' + d + ',left=' + e + ',top=' + j);
                	    }
                        if (b.post) {
                            FB.UIServer._active[b.id] = window.open('about:blank', b.id, c);
                            FB.Content.submitToTarget({
                                url: b.url,
                                target: b.id,
                                params: b.params
                            });
                        } else {
							FB.UIServer._active[b.id] = window.open(b.url, b.id, c);
						}
                        if (b.id in FB.UIServer._defaultCb) FB.UIServer._popupMonitor();
                    }*/
					FB.getLoginStatus(
                        function(response) {
                            share_data[cid].facebook.href = Share.addEvent(share_data[cid].facebook.href);
                                var fb_object = {
									display: 'popup',
									method: method,//'stream.publish',
										attachment: share_data[cid].facebook,
										action_links: share_data[cid].facebook.action_links
									};
                                if ('stream.share' === method) {
                                    fb_object.u = share_data[cid].facebook.href;
                                    fb_object.t = share_data[cid].facebook.name;
									fb_object.attachment = '';
									fb_object.action_links = '';
                                }


                            if (response.session) {
                                login_response(response);
                                if (share_data[cid].facebook.status && '' !== share_data[cid].facebook.status) {
                                    fb_object.message = share_data[cid].facebook.status;
                                }
								FB.ui(
									fb_object,
									stream_callback
								);
                            } else {

								if ($.browser['msie'])
								{
								    //fb_object.display = '';
									FB.login(function(){
										FB.ui(
											fb_object,
											stream_callback
										);
									});
								} else {
									FB.ui(
										fb_object,
										stream_callback
									);

								}
                            }
                        }
                    );
                    /*FB.getLoginStatus(
                        function(response) {
                            if (response.session) {
                                login_response(response);
                            } else {
                                FB.login(login_response);
                            }
                        }
                    );*/
                    Share.displayBox(this, 1);
                return false;
            }

            /***********************END OF FACEBOOK***********************/

            /***************************ORKUT ****************************/
            var orkut_click = function () {
                if (!c.orkut_clicked) {
                    c.orkut_count += 1;
                    c.orkut_clicked = true;
                }
                var send_data = {
                    action: 'save_share_counter',
                    cid: cid,
                    lang: lang,
                    random: Math.random(),
                    value: 'clicked'
                };
                if (Share.petition_id) {
                    send_data.petition_id = Share.petition_id;
                }
                var sclick = document.createElement('script');
                sclick.src = Share.addQS('/act/orkut.php', send_data);
                Share.insert(sclick);
                window.open (decodeURIComponent(Share.addEvent(share_data[cid].orkut.href)), "orkutwindow","status=1,toolbar=1,height=650,width=1024");
                Share.displayBox(this, 1);
                return false;
            }
            /************************END OF ORKUT*************************/

            /****************************TUMBLR***************************/
            var tumblr_click = function () {
                if (!c.tumblr_clicked) {
                    c.tumblr_count += 1;
                    c.tumblr_clicked = true;
                }
                var send_data = {
                    action: 'save_share_counter',
                    cid: cid,
                    lang: lang,
                    random: Math.random(),
                    value: 'clicked'
                };
                if (Share.petition_id) {
                    send_data.petition_id = Share.petition_id;
                }
                var sclick = document.createElement('script');
                sclick.src = Share.addQS('/act/tumblr.php', send_data);
                Share.insert(sclick);
                var coordinates = Share.getCenteredCoords(500, 420);
                window.open ('http://www.tumblr.com/share/link?url=' + Share.addEvent(share_data[cid].tumblr.href) + '&name=' + share_data[cid].tumblr.text + '&description=' + share_data[cid].tumblr.description, "tweetwindow","status=1,toolbar=1,height=420,width=500"+ ",left=" + coordinates[0] +",top=" + coordinates[1]);
                Share.displayBox(this, 1);
                return false;
            }
            /************************END OF TUMBLR*************************/

            /****************************TWITTER ***************************/
            var twitter_click = function () {
                if (!c.twitter_clicked) {
                    c.twitter_count += 1;
                    c.twitter_clicked = true;
                }
                var send_data = {
                    action: 'save_share_counter',
                    cid: cid,
                    lang: lang,
                    random: Math.random(),
                    value: 'clicked'
                };
                if (Share.petition_id) {
                    send_data.petition_id = Share.petition_id;
                }
                var sclick = document.createElement('script');
                sclick.src = Share.addQS('/act/twitter.php', send_data);
                Share.insert(sclick);
                var coordinates = Share.getCenteredCoords(500, 350);
                window.open ('http://twitter.com/share?related=Avaaz&url=' + Share.addEvent(share_data[cid].twitter.href) +'&text=' + encodeURIComponent(share_data[cid].twitter.text) /*decodeURIComponent(j)*/, "tweetwindow","status=1,toolbar=1,height=350,width=500"+ ",left=" + coordinates[0] +",top=" + coordinates[1]);
                Share.displayBox(this, 1);
                return false;
            }
            /************************END OF TWITTER*************************/
            /****************************EMAIL ***************************/
            var email_click = function () {
                if (!c.email_clicked) {
                    c.email_count += 1;
                    c.email_clicked = true;
                }
                var bStats = true;
                if ($(this).data('stats')) {
                    bStats = !!$(this).data('stats');
                }
                var bSubject = !!$(this).data('subject');
                var sSubject = '';
                if (bSubject) {
                    sSubject = $($(this).data('subject')).val();
                }
                var bBody = !!$(this).data('body');
                var sBody = '';
                if (bBody) {
                    sBody = $($(this).data('body')).val();
                }
                var domain = GetEmailDomain();
                var mailto = true;
                domain = domain?domain:'other';

                switch (domain) {
                    case 'gmail':
                        mailto = false;
                        href = Share.addQS('https://mail.google.com/mail/', {
                            view: 'cm',
                            fs: 1,
                            to:'',
                            su: bSubject?sSubject:share_data[cid].email.subject,
                            body: getEdgeData({event: (('undefined' !== typeof rsvp_event_id)?'id='+rsvp_event_id:'')}, bBody?sBody:share_data[cid].email.body) ,
                            ui:2,
                            shva:1
                        });
                        break;
                    default:
                        href = Share.addQS('mailto:', {
                            subject: bSubject?sSubject:share_data[cid].email.subject,
                            body: getEdgeData({event: (('undefined' !== typeof rsvp_event_id)?'id='+rsvp_event_id:'')}, bBody?sBody:share_data[cid].email.body)
                        });
                        break;
                }
                var send_data = {campaign_id: cid, domain: domain};
                if (Share.petition_id) {
                    send_data.petition_id = Share.petition_id;
                }
                if (bStats) {
                    jQuery.post('/act/ajax_send_stats.php', send_data, function () {});
                }
                


                if (!mailto) {
                    window.open (href, "emailwindow","status=1,toolbar=1,height=650,width=1024");
                } else {
                    var iframe = document.createElement('iframe');
                        document.getElementsByTagName('body')[0].appendChild(iframe);
                        $(iframe).hide();
                        iframe.src = href;
                }
                //$(c).attr('href', href);
                Share.displayBox(this, 1);
                return false;
            }
            var email_popup = null;
            var email_click_popup = function () {
                var bStats = true;
                if ($(this).data('stats')) {
                    bStats = !!$(this).data('stats');
                }
                var domain = GetEmailDomain();
                if (!c.email_clicked) {
                    c.email_count += 1;
                    c.email_clicked = true;
                    var send_data = {campaign_id: cid, domain: domain};
                    if (Share.petition_id) {
                        send_data.petition_id = Share.petition_id;
                    }
                    if (bStats) {
                        jQuery.post('/act/ajax_send_stats.php', send_data, function () {});
                    }
                }
                if (email_popup) {
                    email_popup.trigger('click');
                } else {
                    if (!window.colorbox_dialogs) {
                        colorbox_dialogs = {};
                    }
                    colorbox_dialogs.email_popup = $.colorbox(
                        {
                            opacity:0.5,
                            inline:true,
                            href:"#" + $(c).attr('use_popup'),
                            showClose: ('undefined' !== typeof $(c).data('showclose')?$(c).data('showclose'):true),
                            onClosed: function() {
                                openid.closeColorbox();
                            },
                            onComplete:
                                function(){
                                    $(this).colorbox.resize();
                                }
                        });
                }
                //$(c).attr('href', href);
                Share.displayBox(this, 1);
                return false;
            }
            /************************END OF EMAIL*************************/
            $(c).click(function(){return false;}); // fix for IE redirect
            switch(type) {
                case 'facebook':
                    /****************** ADD FACEBOOK SHARE URL ******************/
                    $(c).attr('href', this.addQS('http://www.avaaz.org/act/facebook_share.php', {
                        cid: cid,
                        lang: lang,
                        src: 'sp'
                    }));
                    $(c).click(facebook_click);
                    /************************************************************/
                break;
                case 'orkut':
                    /****************** ADD ORKUT SHARE URL ******************/
                    $(c).attr('href', share_data[cid].orkut.href);
                                        
                    $(c).click(orkut_click);
                    /************************************************************/
                break;
                case 'tumblr':
                    /****************** ADD TUMBLR SHARE URL ******************/
                    $(c).attr('href', 'http://www.tumblr.com/share/link?url=' + share_data[cid].tumblr.href + '&name=' + share_data[cid].tumblr.text + '&description=' + share_data[cid].tumblr.description);                    
                    $(c).click(tumblr_click);
                    /************************************************************/
                break;
                case 'twitter':
                    /****************** ADD TWITTER SHARE URL ******************/
                    $(c).attr('href', 'http://twitter.com/share?related=Avaaz&url=' +share_data[cid].twitter.href+ '&text=' + share_data[cid].twitter.text);
                    $(c).click(twitter_click);
                    /************************************************************/
                break;
                case 'email':
                    /****************** ADD EMAIL SHARE URL ******************/
                    $(c).attr('href', '#');
                    if ($(c).attr('use_popup')) {
                        $(c).click(email_click_popup);
                    } else {
                    $(c).click(email_click);
                    }
                    /************************************************************/
                break;
            }
            c.fb_rendered = true;
        },
        insert: function (a) {
            (document.getElementsByTagName('HEAD')[0] || document.body).appendChild(a);
        },
        renderAll: function () {
           $('.share').filter(
                    function(){
                        return ('undefined' === typeof $(this).attr('sharetype')?false:true);
                    }
            ).each(function(i){Share.URLdata[i] = this});
            var c = Share.URLdata;
            var a = c.length;
            for (var b = 0; b < a; b++) {
                if (!c[b].fb_rendered) this.renderButton(c[b]);
                if (this.results[$(c[b]).attr('sharecid')]) this.updateButton(c[b]);
            }
        },
        fetchData: function () {
            var data = {};
            for (var h in Share.URLdata) {
                if ('function' === typeof Share.URLdata[h])
                    continue;
                var link = Share.URLdata[h];
                var type = $(link).attr('sharetype');
                var cid = $(link).attr('sharecid');
                if ('undefined' === typeof data[cid]){

                    data[cid] = {};
                }
                if ('undefined' === typeof data[cid]['type']) {
                    data[cid]['type'] = {};
                }
                data[cid]['type'][type] = 1;
                /** ADDON FOR PETITIONS ***/
                if (share_data[cid].petition) {
                    Share.petition_id = share_data[cid].petition;
                }
            }
            var send_data = {
                v: '1.0',
                action: 'get_share_count',
                format: 'json',
                data: data
            };
            if (Share.petition_id) {
                send_data.petition_id = Share.petition_id;
            }
            this.resetUrls();

            $.ajax(
                {
                    url:'/stat/act/share_stats.php/' + $.param(send_data),
                    type: 'GET',
                    dataType: 'json',
                    success:function(data) {
                        if (data)
                            share_render(data);
                    }
                }
            );

            /*
             jquery jsonp
                 $.ajax(
                    {
                        url:'/act/share_stats.php',
                        dataType: 'jsonp',
                        jsonpCallback: 'share_render',
                        type: 'GET',
                        data:send_data
                    }
                );
            handwrite jsonp

                send_data['callback'] = 'share_render';
                send_data['time'] = parseInt((new Date()).getTime() / (1000 * 20));
                var a = document.createElement('script');
                a.src = '/stat/act/share_stats.php/' + $.param(send_data);
                this.insert(a);
            */
        },
        renderPass: function () {
            Share.renderAll();
            if (Share.URLdata.length > 0) {Share.fetchData()};
        },
        _onFirst: function () {
            this.resetUrls();
            window.share_render = function (b) {
                for (var h in b) Share.results[h] = b[h];
                Share.renderAll();
            };
            this.renderPass();
        }
    };
    $(document).ready(function(){Share._onFirst();});
}

///* cjZeroClipboard.js */
// Simple Set Clipboard System
// Author: Joseph Huckaby

var ZeroClipboard = {
	
	version: "1.0.7",
	clients: {}, // registered upload clients on page, indexed by id
	moviePath: 'ZeroClipboard.swf', // URL to movie
	nextId: 1, // ID of next movie
	
	$: function(thingy) {
		// simple DOM lookup utility function
		if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
		if (!thingy.addClass) {
			// extend element with a few useful methods
			thingy.hide = function() { this.style.display = 'none'; };
			thingy.show = function() { this.style.display = ''; };
			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
			thingy.removeClass = function(name) {
				var classes = this.className.split(/\s+/);
				var idx = -1;
				for (var k = 0; k < classes.length; k++) {
					if (classes[k] == name) { idx = k; k = classes.length; }
				}
				if (idx > -1) {
					classes.splice( idx, 1 );
					this.className = classes.join(' ');
				}
				return this;
			};
			thingy.hasClass = function(name) {
				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
			};
		}
		return thingy;
	},
	
	setMoviePath: function(path) {
		// set path to ZeroClipboard.swf
		this.moviePath = path;
	},
	
	dispatch: function(id, eventName, args) {
		// receive event from flash movie, send to client		
		var client = this.clients[id];
		if (client) {
			client.receiveEvent(eventName, args);
		}
	},
	
	register: function(id, client) {
		// register new client to receive events
		this.clients[id] = client;
	},
	
	getDOMObjectPosition: function(obj, stopObj) {
		// get absolute coordinates for dom element
		var info = {
			left: 0, 
			top: 0, 
			width: obj.width ? obj.width : obj.offsetWidth, 
			height: obj.height ? obj.height : obj.offsetHeight
		};

		while (obj && (obj != stopObj)) {
			info.left += obj.offsetLeft;
			info.top += obj.offsetTop;
			obj = obj.offsetParent;
		}

		return info;
	},
	
	Client: function(elem) {
		// constructor for new simple upload client
		this.handlers = {};
		
		// unique ID
		this.id = ZeroClipboard.nextId++;
		this.movieId = 'ZeroClipboardMovie_' + this.id;
		
		// register client with singleton to receive flash events
		ZeroClipboard.register(this.id, this);
		
		// create movie
		if (elem) this.glue(elem);
	}
};

ZeroClipboard.Client.prototype = {
	
	id: 0, // unique ID for us
	ready: false, // whether movie is ready to receive events or not
	movie: null, // reference to movie object
	clipText: '', // text to copy to clipboard
	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
	cssEffects: true, // enable CSS mouse effects on dom container
	handlers: null, // user event handlers
	
	glue: function(elem, appendElem, stylesToAdd) {
		// glue to DOM element
		// elem can be ID or actual DOM element object
		this.domElement = ZeroClipboard.$(elem);
		
		// float just above object, or zIndex 99 if dom element isn't set
		var zIndex = 99;
		if (this.domElement.style.zIndex) {
			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
		}
		
		if (typeof(appendElem) == 'string') {
			appendElem = ZeroClipboard.$(appendElem);
		}
		else if (typeof(appendElem) == 'undefined') {
			appendElem = document.getElementsByTagName('body')[0];
		}
		
		// find X/Y position of domElement
		var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
		
		// create floating DIV above element
		this.div = document.createElement('div');
		var style = this.div.style;
		style.position = 'absolute';
		style.left = '' + box.left + 'px';
		style.top = '' + box.top + 'px';
		style.width = '' + box.width + 'px';
		style.height = '' + box.height + 'px';
		style.zIndex = zIndex;
		
		if (typeof(stylesToAdd) == 'object') {
			for (addedStyle in stylesToAdd) {
				style[addedStyle] = stylesToAdd[addedStyle];
			}
		}
		
		// style.backgroundColor = '#f00'; // debug
		
		appendElem.appendChild(this.div);
		
		this.div.innerHTML = this.getHTML( box.width, box.height );
	},
	
	getHTML: function(width, height) {
		// return HTML for movie
		var html = '';
		var flashvars = 'id=' + this.id + 
			'&width=' + width + 
			'&height=' + height;
			
		if (navigator.userAgent.match(/MSIE/)) {
			// IE gets an OBJECT tag
			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
		}
		else {
			// all other browsers get an EMBED tag
			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
		}
		return html;
	},
	
	hide: function() {
		// temporarily hide floater offscreen
		if (this.div) {
			this.div.style.left = '-2000px';
		}
	},
	
	show: function() {
		// show ourselves after a call to hide()
		this.reposition();
	},
	
	destroy: function() {
		// destroy control and floater
		if (this.domElement && this.div) {
			this.hide();
			this.div.innerHTML = '';
			
			var body = document.getElementsByTagName('body')[0];
			try { body.removeChild( this.div ); } catch(e) {;}
			
			this.domElement = null;
			this.div = null;
		}
	},
	
	reposition: function(elem) {
		// reposition our floating div, optionally to new container
		// warning: container CANNOT change size, only position
		if (elem) {
			this.domElement = ZeroClipboard.$(elem);
			if (!this.domElement) this.hide();
		}
		
		if (this.domElement && this.div) {
			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
			var style = this.div.style;
			style.left = '' + box.left + 'px';
			style.top = '' + box.top + 'px';
		}
	},
	
	setText: function(newText) {
		// set text to be copied to clipboard
		this.clipText = newText;
		if (this.ready) this.movie.setText(newText);
	},
	
	addEventListener: function(eventName, func) {
		// add user event listener for event
		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
		if (!this.handlers[eventName]) this.handlers[eventName] = [];
		this.handlers[eventName].push(func);
	},
	
	setHandCursor: function(enabled) {
		// enable hand cursor (true), or default arrow cursor (false)
		this.handCursorEnabled = enabled;
		if (this.ready) this.movie.setHandCursor(enabled);
	},
	
	setCSSEffects: function(enabled) {
		// enable or disable CSS effects on DOM container
		this.cssEffects = !!enabled;
	},
	
	receiveEvent: function(eventName, args) {
		// receive event from flash
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
				
		// special behavior for certain events
		switch (eventName) {
			case 'load':
				// movie claims it is ready, but in IE this isn't always the case...
				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
				this.movie = document.getElementById(this.movieId);
				if (!this.movie) {
					var self = this;
					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
					return;
				}
				
				// firefox on pc needs a "kick" in order to set these in certain cases
				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
					var self = this;
					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
					this.ready = true;
					return;
				}
				
				this.ready = true;
				this.movie.setText( this.clipText );
				this.movie.setHandCursor( this.handCursorEnabled );
				break;
			
			case 'mouseover':
				if (this.domElement && this.cssEffects) {
					this.domElement.addClass('hover');
					if (this.recoverActive) this.domElement.addClass('active');
				}
				break;
			
			case 'mouseout':
				if (this.domElement && this.cssEffects) {
					this.recoverActive = false;
					if (this.domElement.hasClass('active')) {
						this.domElement.removeClass('active');
						this.recoverActive = true;
					}
					this.domElement.removeClass('hover');
				}
				break;
			
			case 'mousedown':
				if (this.domElement && this.cssEffects) {
					this.domElement.addClass('active');
				}
				break;
			
			case 'mouseup':
				if (this.domElement && this.cssEffects) {
					this.domElement.removeClass('active');
					this.recoverActive = false;
				}
				break;
		} // switch eventName
		
		if (this.handlers[eventName]) {
			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
				var func = this.handlers[eventName][idx];
			
				if (typeof(func) == 'function') {
					// actual function reference
					func(this, args);
				}
				else if ((typeof(func) == 'object') && (func.length == 2)) {
					// PHP style object + method, i.e. [myObject, 'myMethod']
					func[0][ func[1] ](this, args);
				}
				else if (typeof(func) == 'string') {
					// name of function
					window[func](this, args);
				}
			} // foreach event handler defined
		} // user defined handler for event
	}
	
};

///* cjjquery.field.v0.9.3.min.js */
/*
 * jQuery Field Plug-in
 *
 * Copyright (c) 2007 Dan G. Switzer, II
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: 15
 * Version: 0.9.3
 *
*/
(function(e){var h={delimiter:",",checkboxRangeKeyBinding:"shiftKey",useArray:false};e.Field={version:"0.9.3",setDefaults:function(a){e.extend(h,a)},setProperty:function(a,b){h[a]=b},getProperty:function(a){return h[a]}};e.fn.fieldArray=function(a){var b;b=a;var c=(typeof b).toLowerCase();if(c=="object")if(b instanceof Array)c="array";else if(b instanceof Date)c="date";b=c;if(b=="undefined")return l(this);if(b=="string"||b=="number"){a=a.toString().split(h.delimiter);b="array"}if(b=="array")return m(this,
a);return this};e.fn.getValue=function(){return l(this).join(h.delimiter)};var l=function(a){var b=[];a.each(function(){switch(o(this)){case "checkbox":case "radio":this.checked&&b.push(this.value);break;case "select":if(this.type=="select-one")b.push(this.selectedIndex==-1?"":n(this[this.selectedIndex]));else for(var c=0;c<this.length;c++)this[c].selected&&b.push(n(this[c]));break;case "text":b.push(this.value)}});return b};e.fn.setValue=function(a){return m(this,!a&&a!==0?[""]:a.toString().split(h.delimiter))};
var m=function(a,b){a.each(function(){var c;switch(o(this)){case "checkbox":case "radio":this.checked=e.inArray(this.value,b)>-1?true:false;break;case "select":for(var f=this.type=="select-one",g=true,d=0;d<this.length;d++){c=n(this[d]);if(bSelectItem=e.inArray(c,b)>-1){this[d].selected=true;if(f){g=false;break}}else if(!f)this[d].selected=false}if(f&&g&&this[0])this[0].selected=true;break;case "text":this.value=b.join(h.delimiter)}});return a};e.fn.formHash=function(a){var b=arguments.length==0,
c={};this.filter("form").each(function(){for(var f=this.elements,g,d,k={},i=0,j=f.length;i<j;i++){g=f[i];d=g.name;if(!(!d||k[d])){g=e(g.tagName.toLowerCase()+"[name='"+d+"']",this);if(b)c[d]=g[h.useArray?"fieldArray":"getValue"]();else if(typeof a[d]!="undefined")g[h.useArray?"fieldArray":"setValue"](a[d]);k[d]=true}}});return b?c:this};e.fn.autoAdvance=function(a){return this.find(":text,:password,textarea").bind("keyup.autoAdvance",function(b){var c=e(this),f=parseInt(c.attr("maxlength"),10);if(isNaN(f)||
"|9|16|37|38|39|40|".indexOf("|"+b.keyCode+"|")>-1)return true;if(c.getValue().length>=c.attr("maxlength")){b=c.moveNext().select();e.isFunction(a)&&a.apply(c,[b])}})};e.fn.moveNext=function(){return this.moveIndex("next")};e.fn.movePrev=function(){return this.moveIndex("prev")};e.fn.moveIndex=function(a){var b=p(this);if(a=="next")a=b[0]+1;else if(a=="prev")a=b[0]-1;if(a<0)a=b[1].length-1;else if(a>=b[1].length)a=0;return e(b[1][a]).trigger("focus")};e.fn.getTabIndex=function(){return p(this)[0]};
var p=function(a){a=a.filter("input, select, textarea").get(0);var b=[],c=[];if(!a)return[-1,[]];e.each(a.form.elements,function(g,d){if(d.tagName!="FIELDSET"&&!d.disabled)d.tabIndex>0?b.push(d):c.push(d)});b.sort(function(g,d){return g.tabIndex-d.tabIndex});b=e.merge(b,c);for(var f=0;f<b.length;f++)if(b[f]==a)return[f,b];return[-1,b]};e.fn.limitSelection=function(a,b){var c=jQuery.extend(a&&a.constructor==Object?a:{limit:a,onsuccess:function(){return true},onfailure:function(g){alert("You can only select a maximum a of "+
g+" items.");return false}},b),f=this;return this.bind(f[0]&&f[0].type=="select-multiple"?"change.limitSelection":"click.limitSelection",function(){var g;g=this.type=="select-multiple"?e("option:selected",f).length:this.type=="checkbox"?f.filter(":checked").length:0;if(g>c.limit){this.type=="select-multiple"&&m(f,l(f).slice(0,c.limit));return c.onfailure.apply(f,[c.limit])}c.onsuccess.apply(f,[c.limit]);return true})};e.fn.createCheckboxRange=function(a){var b=jQuery.extend(a&&a.constructor==Object?
a:{bind:h.checkboxRangeKeyBinding,click:a},a),c=0,f=this,g=e.isFunction(b.click);g&&this.each(function(){b.click.apply(this,[e.event.fix({type:null}),e(this).is(":checked")])});return this.each(function(){if(this.type!="checkbox")return false;e(this).unbind("click.createCheckboxRange").bind("click.createCheckboxRange",function(d){var k=this.checked,i=f.index(d.target),j=Math.min(c,i);i=Math.max(c+1,i);g&&e(this).each(function(){b.click.apply(this,[d,k])});if(d[b.bind]){for(j=j;j<i;j++){var q=f.eq(j).attr("checked",
k?"checked":"").trigger("change");g&&b.click.apply(q[0],[d,k])}return true}}).bind("click.createCheckboxRange",function(d){c=f.index(d.target)});return true})};var o=function(a){a=a.type;switch(a){case "select":case "select-one":case "select-multiple":a="select";break;case "text":case "hidden":case "textarea":case "password":case "button":case "submit":case "submit":a="text"}return a},n=function(a){return jQuery.browser.msie&&!a.attributes.value.specified?a.text:a.value}})(jQuery);

///* ncjfront-sign-form.js */
function showLightBox() {
    hs.htmlExpand(null, {
            contentId: 'block-lightbox',
            align:'center',
            fadeInOut: true,
            dimmingOpacity:0.75 ,
            slideshowGroup: 'html',
            numberPosition: null,
            outlineType: ''
    });
}

function copy_select() {
    this.select();
}

$("#sform_copy_text").click(copy_select);
function loadClipButtonFront (){
    var elm = this;
    ZeroClipboard.setMoviePath( '/common/js/ZeroClipboard.swf');
    var clip = new ZeroClipboard.Client();
    clip.setText( '' ); // will be set later on mouseDown
    clip.setHandCursor( true );
    clip.setCSSEffects( true );
    clip.addEventListener( 'mouseDown', function(client) {
            // set text to copy here
            clip.setText($("#sform_copy_text").val());
            $("#sform_copy_text").focus().get(0).select();
            // alert("mouse down");
    } );
    // set the clip text to our innerHTML
	clip.glue(this, $("#sform_copy_button").parent()[0]);
}

function loadFrontClip() {
    $("#sform_copy_button").parent().css({'position': 'relative'});
    $("#sform_copy_button").each(loadClipButtonFront);
}

function lightbox_close() {
    $('#lightbox-before').show();
    $('#lightbox-after').hide();
}

function send_lightboxform(form) {
    $('#lightbox-loading-animation').show();
    var send_data = $(form).formHash();
    SetEmailDomain(send_data.Email);
    $.ajax({
        url:'/act/?r=act_ajax', dataType: 'json',
        type: 'POST',
        data: send_data,
        success: function (html) {
            $('#lightbox-loading-animation').hide();
            $('#lightbox-before').fadeOut('slow', function(){$('#lightbox-after').fadeIn('fast', function(){
                $(form).get(0).reset();
                $.colorbox.resize();
                setTimeout(loadFrontClip, 2000);
                $('#block-welcome-to-avaaz').show();
            });});

        }
    });
}

function check_postcode(select, postcode) {
    var $labelfor = $('label[for="form-joinus-postcode"]');
    if ('' != $labelfor.html()) {
        $labelfor.data('realValue', $labelfor.html());
    }
    if (!postcode.disabled) {
        $(postcode).data('realValue', postcode.value);
    }
    postcode.disabled = false;
    $labelfor.html('');
    $(postcode).val('checking...');
    $.ajax({
        url: '/act/index.php?r=ajaxCheckCountry',
        dataType: 'html',
        type: 'POST',
        async:false,
        data: {
            country: $(select).val()
        },
        success:function (data){
            if (data!='1') {
                $(postcode).data('hasPostcode', false);
                var rv;
                rv = $(postcode).data('realValue');
                $(postcode).val('');
                form_joinus.element(postcode);
                postcode.disabled = true;
			} else {
                $(postcode).data('hasPostcode', true);
                var rv;
                rv = $(postcode).data('realValue');
                $(postcode).val(rv);
                $labelfor.html($labelfor.data('realValue'));
			}
        }
    });
}

$(document).ready(function(){
    $('#form-joinus-country').change(function(){
	check_postcode(this, $('#form-joinus-postcode').get(0));
    });

    $(".link_actionsignup").colorbox({opacity:0.5,inline:true, href:"#block-lightbox", onComplete: function(){$(this).colorbox.resize();}, onClosed: lightbox_close});
    var $_GET = getArgs();

    if ($_GET['action'] && 'signup' === $_GET['action']) {
        $(".link_actionsignup").eq(0).trigger('click');
        if ($_GET['email']) {
            $('#form-joinus-email').val($_GET['email']).trigger('blur');
        }
    }

    //$("#sform_copy_button").parent().parent().css({'position': 'relative'});
    //$("#sform_copy_button").parent().each(loadClipButtonFront);
    //$("#sform_copy_button").each(loadClipButtonFront);

    /*jQuery.validator.addMethod("defaultInvalid", function(value, element) {
	  return value != element.defaultValue;
    }, "");*/

    jQuery.validator.addMethod("specialpostcode", function(value, element) {
      if (true === $(element).data('hasPostcode')) {
	  return value != '' && value != element.defaultValue;
      } else {
	  return true;
      }
  }, "");
});
$('#form-joinus-email').ready(
function(){
    var timeout;
    var wrong_timeout;
    var wrong = false;
    var KEY = {
            UP: 38,
            DOWN: 40,
            DEL: 46,
            TAB: 9,
            RETURN: 13,
            ESC: 27,
            COMMA: 188,
            PAGEUP: 33,
            PAGEDOWN: 34,
            BACKSPACE: 8
        };
    var lastKeyPressCode;
    function onBlurE(){
        var obj = $('#form-joinus-email').get(0);
        var email_pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))\s*$/;
        if(!email_pattern.test(obj.value)){
            if(obj.value != ''){
            }
        }
    }
    function onChange(){
        var obj = $('#form-joinus-email').get(0);
        if (obj.value != obj.lastValue){
            $(obj).css('background-image', "url('/images/upload_mini.gif')");
            $(obj).css('background-position', "right center");
            $(obj).css('background-repeat', "no-repeat");
            var email_pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))\s*$/;
            if(!email_pattern.test(obj.value)){
                if(obj.value != ''){
                } else {
                }
                clearTimeout(wrong_timeout);
                wrong_timeout = setTimeout(function(){
                    $(obj).css('background-image', "none");
                    if (!wrong) {
                        $('.user_not_exists').show();
                        $('.user_exists').hide();
                        wrong = true;
                        $.colorbox.resize();
                        $('#form-joinus-email').focus();
                    }

                }, 1000);
            }else{
                wrong = false;
                $(obj).css('background-image', "url('/images/upload_mini.gif')");
                $(obj).css('background-position', "right center");
                $(obj).css('background-repeat', "no-repeat");
                $.get('/act/index.php?r=checkemailexists&Email=' + encodeURIComponent(obj.value),{}, function(data){
                    $(obj).css('background-image', "none");
                    results = data.split('|');
                    if (results[0] == 'true'){
                        $('.user_not_exists').hide();
                        $('.user_exists').show();
                        is_simple = true;
                    } else {
                        $('.user_not_exists').show();
                        $('.user_exists').hide();
                        is_simple = false;
                    }
                    $.colorbox.resize();
                    $('#form-joinus-email').focus();
                });
            }
        }
        obj.lastValue = obj.value;
    };
//    $('#EmailSimpleForm').keyup(ff).change(ff);
    //$('#EmailSimpleForm').blur(onBlurE);
    $('#form-joinus-email').bind(($.browser.opera ? "keypress" : "keydown"), function(event){
        lastKeyPressCode = event.keyCode;
        switch(event.keyCode) {
            case KEY.UP:
                event.preventDefault();
//                onChange(0, true);
                break;

            case KEY.DOWN:
                event.preventDefault();
//                onChange(0, true);
                break;

            case KEY.PAGEUP:
                event.preventDefault();
//                onChange(0, true);
                break;

            case KEY.PAGEDOWN:
                event.preventDefault();
//                onChange(0, true);
                break;

            // matches also semicolon
            case KEY.TAB:
            case KEY.RETURN:

                break;

            case KEY.ESC:
                break;

            default:
                clearTimeout(timeout);
                timeout = setTimeout(onChange, 400);
                break;
        }
    });


});

