﻿$j = jQuery.noConflict();

if (typeof console == 'undefined'){
	console = {};
}

if (typeof console.log == 'undefined'){
	console.log = function(){};
}

if (typeof console.dir == 'undefined') 	console.dir = function(){};

if (typeof jQuery.validator != 'undefined'){

	// a custom method making the default value for companyurl ("http://") invalid, without displaying the "invalid url" message
	jQuery.validator.addMethod("defaultInvalid", function(value, element) {
		return value != element.defaultValue;
	}, "");

	jQuery.validator.addMethod("regexpression", function(value, element, param) { 
	  return value.match(new RegExp(param)); 
	}, ""); 
	
	jQuery.validator.addMethod("anyurl", function(value) { 
	  return jQuery.trim(value).length > 0 && value != 'http://'; 
	}, "Please supply a URL");
	
	jQuery.validator.addMethod("stricturl", function(value) { 
	  return jQuery.trim(value).length == 0 || value.match( /^(((http(s?)))\:\/\/)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|asia|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|travel|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn|ye|yt|yu|za|zm|zw)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$/i );
	}, "Please supply a URL");
}


function NullOrEmpty(str){
	if (str == null) return true;
	var s = jQuery.trim(str);
	return s.length == 0;
}

function Eval(json){
	return eval( '(' + json + ')' );
}

function Defined(obj){
	return typeof obj != 'undefined';
}

// Array.unique( strict ) - Remove duplicate values
Array.prototype.unique = function( b ) {
 var a = [], i, l = this.length;
 for( i=0; i<l; i++ ) {
  if( a.indexOf( this[i], 0, b ) < 0 ) { a.push( this[i] ); }
 }
 return a;
};

// Array.indexOf( value, begin, strict ) - Return index of the first element that matches value
Array.prototype.indexOf = function( v, b, s ) {
 for( var i = +b || 0, l = this.length; i < l; i++ ) {
  if( this[i]===v || s && this[i]==v ) { return i; }
 }
 return -1;
};

Array.prototype.removenull = function( b ) {
 var a = [], i, l = this.length;
 for( i=0; i<l; i++ ) {
  if( this[i] != null && typeof this[i] != 'undefined') { a.push( this[i] ); }
 }
 return a;
};

function dynamicLoadScript(src, id) {
  $j('#' + id).remove();
  var script = document.createElement("script");
  script.setAttribute("id", id);
  script.setAttribute("src", src);
  script.setAttribute("type", "text/javascript");
  document.documentElement.firstChild.appendChild(script);
}


var RTT_hintColour ="gray";

//Adds hint to element
function SetElementHint(ele,hint){
    ele.blur ( function() { RTT_HintBlur(ele, hint)  } );
    ele.focus ( function() { RTT_HintFocus(ele, hint)  } );
    RTT_HintBlur(ele,hint);
    return true;
}
function RTT_HintFocus(ele,hint){if(ele.css("color")==RTT_hintColour){ele.val("");ele.css("color","");}}
function RTT_HintBlur(ele,hint){if(!ele.val()||ele.val()==hint){ele.css("color",RTT_hintColour);ele.val(hint);}}

//Returns true value for hinted element
function RTT_GetHintedValue(ele){
    return ele.css("color")==RTT_hintColour ? '' : ele.val();
}


function BindPressEnter(cssSelector, callback){
     $j(cssSelector).keypress( function (eve){ 
		if(eve.keyCode == 13){  
            callback.apply(this);
		}  
	 });
}


function SetOpacity(element, opacity) {
  if (navigator.userAgent.indexOf("MSIE") != - 1) {
     var normalized = Math.round(opacity * 100); element.style.filter = "alpha(opacity=" + normalized + ")"; }
  else {
     element.style.opacity = opacity; 
  }
}


tagger = {};
tagger.utils = {};

tagger.utils.StringBuffer = function() { 
   this.buffer = []; 
} 

tagger.utils.StringBuffer.prototype.append = function(string) { 
	this.buffer.push(string); 
	return this; 
}; 

tagger.utils.StringBuffer.prototype.toString = function() { 
	return this.buffer.join(""); 
}; 



/***** Global UI *****/

function SetPageErrorMessage(message)
{
	$j('#pageErrorMessage div.message').text(message);
	ShowPageErrorMessage();
}

function ShowPageErrorMessage(){
	$j('#pageErrorMessage').show();
}

function SetPageSuccessMessage(message)
{
	$j('#pageSuccessMessage div.message').text(message);
	ShowPageSuccessMessage();
}

function ShowPageSuccessMessage(){
	$j('#pageSuccessMessage').show();
}

function HidePageResponseMesssage(){
	$j('#pageErrorMessage, #pageSuccessMessage').hide();
}


/***** Window Management *****/

function popup(url, title, width, height) 
{ 
	var numArgs = popup.arguments.length; var windowParams; var ht; var windowObj; if (numArgs > 4) { windowParams = popup.arguments[4]; }
	else { windowParams = "statusbar=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes,top=0"; }
	if (screen.height) { ht = screen.height; }
	else if (window.document.body.clientHeight) { ht = window.document.body.clientHeight; }
	else if (window.innerHeight) { ht = window.innerHeight; }
	else if (document.documentElement.clientHeight) { ht = document.documentElement.clientHeight; }
	else { ht = 580; }
	if (height != 0 && height > ht) { height = ht; }
	if (height != 0 && width != 0) { windowParams = windowParams + ",top=0,height=" + height + ",width=" + width; }
	else if (width != 0) { windowParams = windowsParams + ",top=0,width=" + width; }
	windowObj = window.open(url, title, windowParams, false); if (windowObj) { windowObj.focus(); }
	return windowObj; 
 }
 
 function SetCookie(name,val){
	Set_Cookie(name,val,365*2);
 }
 
 

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;
	}
	var expires_date = new Date( today.getTime() + (expires) );

	document.cookie = name + "=" +escape( value ) +
	( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
	( ( path ) ? ";path=" + path : "" ) + 
	( ( domain ) ? ";domain=" + domain : "" ) +
	( ( secure ) ? ";secure" : "" );
}


// this fixes an issue with the old method, ambiguous values 
// with this test document.cookie.indexOf( name + "=" );
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 = document.cookie.split( ';' );
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f
	
	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;
	}
}	






function InvalidIcon(ele){
	var Url_StaticMissingIcon = 'http://content.retaggr.com/static/noicon.gif';
	if (ele.src != Url_StaticMissingIcon) ele.src = Url_StaticMissingIcon;
}



/* ---- Card Stuff ----- */

retaggr = {}
retaggr.cardDimensions = { x : 360, y : 300 };
retaggr.ShowInfoCard = function(username, event){
	
	var redisplay = false;
	if(window.retaggr.InfoWindow == null){
		retaggr.CreateInfoWindow();
	}else{
		if (window.retaggr.InfoWindow.username == username){
			redisplay = true;
		}else{	
			window.retaggr.InfoWindow.style.display ="none";
		}
	}
	
	window.retaggr.InfoWindow.username = username;
	
	var eventXY = retaggr.getEventXY(event);
	var xy = retaggr.GetXYForCard(event);
	var left = xy.x;
	var top = xy.y;
	
	var width = new Number(window.retaggr.InfoWindow.style.width.replace("px", ""));
	var height = new Number(window.retaggr.InfoWindow.style.height.replace("px", ""));
	
	var params = {
		infoWindowLeft : left, 
		infoWindowTop : top, 
		btnCloseLeft : (left + width - 28), 
		btnCloseTop : top + 9, 
		waitPanelTop : eventXY.y -5, 
		waitPanelLeft : eventXY.x -5
	};
	
	retaggr.PrepareCard(params);
	
	if (redisplay){
		window.retaggr.InfoWindow.style.display = window.retaggr.BtnClose.style.display = '';
		return;
	}
	
	window.retaggr.WaitPanel.style.display = "inline";
	var url = "/Embed/" + username + "/Internal/"; // + "?siteID=" + window.retaggrOptions.siteID;
	
	window.retaggr.InfoWindow.setAttribute("src", url);
}

retaggr.PrepareCard = function(params){
	window.retaggr.InfoWindow.style.left= params.infoWindowLeft + "px";
	window.retaggr.InfoWindow.style.top = params.infoWindowTop + "px";
	window.retaggr.BtnClose.style.left = params.btnCloseLeft + "px";
	window.retaggr.BtnClose.style.top = params.btnCloseTop +  "px";
	window.retaggr.WaitPanel.style.top = params.waitPanelTop + "px";
	window.retaggr.WaitPanel.style.left = params.waitPanelLeft + "px";
}



retaggr.CreateInfoWindow = function(){
	
	var ifr = document.createElement("iframe");
	retaggr.SetStyle(ifr, { background: "transparent",  position:"absolute",display:"none",zIndex:"40000",width: retaggr.cardDimensions.x + "px",height: retaggr.cardDimensions.y + "px",border:"none",margin:"0",padding:"0",overflow:"hidden", frameborder: "0px" } );
	ifr.setAttribute("frameborder", "0");
	ifr.setAttribute("frameBorder", "0");
	ifr.setAttribute("border", "0");
	ifr.allowTransparency = true; //IE
	ifr.className = 'tagger_iframe';
	
	document.body.appendChild(ifr);
	window.retaggr.InfoWindow = ifr;
	
	var divWait = document.createElement("div");
	retaggr.SetStyle(divWait, { background: "transparent",  position:"absolute",display:"none", zIndex:"40001",width:"20px",height:"20px",border:"none",margin:"0",padding:"0",overflow:"hidden", color:"white"} );
	divWait.innerHTML = "<img src='" + retaggr.StaticAddress() +  "Content/Images/fetchingYellow.gif' />";
	document.body.appendChild(divWait);
	
	window.retaggr.WaitPanel = divWait;
	
	retaggr.AddHandler(ifr,"load", function(){
		window.retaggr.InfoWindow.style.display ="inline";
		window.retaggr.BtnClose.style.display ="inline";
		window.retaggr.WaitPanel.style.display = "none";
	});
	
	var btnClose = document.createElement('img');
	btnClose.setAttribute('src',retaggr.StaticAddress() +  'Content/images/close-up.gif');
	retaggr.SetStyle(btnClose, { zIndex : "40001", position: "absolute", display : "none", cursor : "pointer" } );
	retaggr.AddHandler(btnClose, 'mousedown', function(){ retaggr.FadeInfoWindow();});
	document.body.appendChild(btnClose);
	window.retaggr.BtnClose = btnClose;
}

retaggr.SetStyle = function(target, style){
	for(var x in style){
		target.style[x] = style[x];
	}
}

retaggr.StaticAddress = function(){
	return "/";
}
retaggr.AddHandler = function(target,eventName,handlerName){
    if ( target.addEventListener )
      target.addEventListener(eventName, handlerName, false);  
    else if ( target.attachEvent )
      target.attachEvent("on" + eventName, handlerName);
    else
      target["on" + eventName] = handlerName;
}

retaggr.ShowCardForLink = function(event, ele){
	event = event || window.event;
	try{
	var link = ele.attributes['href'].nodeValue;
	var username = link.substring( link.indexOf('/Card/') + 6 );
	retaggr.ShowInfoCard( username, event);
	}catch(e){
	console.error(e);
	}
	event.cancelBubble = true;
	if (event.stopPropagation) event.stopPropagation();
	return false;
}

retaggr.GetXYForCard = function(event){
	var x,y;
	var vp = retaggr.getViewPort();
	var eventXY = retaggr.getEventXY(event);
	var topOffset =  document.documentElement.scrollTop ? document.documentElement.scrollTop : ( document.body.scrollTop ? document.body.scrollTop : window.pageYOffset );
	var distFromViewPortTop = eventXY.y - topOffset;
	var remainingSpaceBelow =  vp.h - distFromViewPortTop;
	var cardHeight = retaggr.cardDimensions.y;
	
	if (remainingSpaceBelow <= cardHeight){
		x = eventXY.x;
		y = eventXY.y - cardHeight;
	}else{
		x = eventXY.x;
		y = eventXY.y;
	}
	
	return { x : x, y : y};
}

retaggr.getViewPort = function(){
	 var viewportwidth;
	 var viewportheight;
	 
	 // standards compliant 
	 if (typeof window.innerWidth != 'undefined')
	 {
		  viewportwidth = window.innerWidth,
		  viewportheight = window.innerHeight
	 }
	// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
	 else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0)
	 {
		   viewportwidth = document.documentElement.clientWidth,
		   viewportheight = document.documentElement.clientHeight
	 }
	 // older versions of IE
	 else
	 {
		   viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
		   viewportheight = document.getElementsByTagName('body')[0].clientHeight
	 }
	 
	 return { w : viewportwidth, h : viewportheight };
}

retaggr.getEventXY = function(e){
	var posx = 0;
	var posy = 0;
	if (e.pageX || e.pageY){
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	return { x: posx, y : posy};
}

retaggr.FadeInfoWindow = function(){

	window.clearTimeout( retaggr.InfoWindowTimeout );
	retaggr.InfoWindowTimeout = window.setTimeout( function(){
		if (window.retaggr.InfoWindow) {
			window.retaggr.InfoWindow.style.display = window.retaggr.BtnClose.style.display = 'none';
		}
	}, 50);
}

