var ERROR_VOTE_EXISTS = 19;
var ERROR_VOTE_OCCURRED_TOO_SOON = 89;
var KARMA_MINIMUM_COMMENT_LENGTH = 125;
var KARMA_LONG_COMMENT_LENGTH = 125;
var KARMA_ADD_SHORT_COMMENT_AMOUNT = 0;
var KARMA_ADD_LONG_REVIEW_QUEUE_COMMENT_INCREMENT_BASE_WORD_COUNT = 1500;
var KARMA_ADD_LONG_REVIEW_QUEUE_COMMENT_INCREMENT_PAGE_SIZE = 1500;
var KARMA_ADD_LONG_REVIEW_QUEUE_COMMENT_PER_WORD_AMOUNT = 0.003;
var KARMA_ADD_LONG_REVIEW_QUEUE_COMMENT_PER_WORD_INCREMENT_AMOUNT = 0.001;
var KARMA_ADD_LONG_REVIEW_QUEUE_COMMENT_BASE_AMOUNT = 1;
var KARMA_ADD_LONG_COMMENT_INCREMENT_BASE_WORD_COUNT = 1500;
var KARMA_ADD_LONG_COMMENT_INCREMENT_PAGE_SIZE = 1500;
var KARMA_ADD_LONG_COMMENT_PER_WORD_AMOUNT = 0.0015;
var KARMA_ADD_LONG_COMMENT_PER_WORD_INCREMENT_AMOUNT = 0.0005;
var KARMA_ADD_LONG_COMMENT_BASE_AMOUNT = 0.5;
var CRITIQUE_MS_BEFORE_WORDCOUNT_UPDATE = 15000;
var CRITIQUE_MS_BEFORE_AUTOSAVE = 300000;
var ERROR_INVALID_EMAIL = 29;
var ERROR_EMAIL_EXISTS = 74;

var fadeInSpeed = 400;
var fadeOutSpeed = 400;
var isIe = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
var _hintId;

function DeleteHint(hintId){
	_hintId = hintId;
	ac = new AjaxConnection();

	var params = new Object();
	params["hintid"] = hintId;

	ac.Send("/webservices/deletehint.php", params, "DeleteHintComplete");
}

function DeleteHintComplete(){
	$("#hint" + _hintId).slideUp();
}

function Trim(string){
	string = string.replace(/^\s+/, '');
	return string.replace(/\s+$/, '');
}

function TrimDashes(string){
	string = string.replace(/^-+/, '');
	return string.replace(/-+$/, '');
}

function StripSlashes(str) {
	str=str.replace(/\\'/g,'\'');
	str=str.replace(/\\"/g,'"');
	str=str.replace(/\\\\/g,'\\');
	str=str.replace(/\\0/g,'\0');
	return str;
}

function MakeUrlSafe(text){
	//trim and convert to lowercase
	//remove apostrophes
	//then convert any non-digit, non-letter character to a space
	//then convert any instance of one or more space to underscore
	//finally, trim underscores
	text = Trim(text).toLowerCase();
	text = text.replace("'", '');
	text = text.replace(/[^0-9a-zA-Z]/ig, ' ', text);
	text = text.replace(/\s+/ig, '-', text);
	text = TrimDashes(text);
	return text;
}

function TrimTextArea(field, maxChars){
	if (field.value.length >= maxChars) // if too long...trim it!
	field.value = field.value.substring(0, maxChars - 1);
}


function GetCheckedValue(radioObj) {
	if(!radioObj)
		return "";

	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

function HtmlEntities(texto){
    //by Micox - elmicoxcodes.blogspot.com - www.ievolutionweb.com
    var i,carac,letra,novo='';
    for(i=0;i<texto.length;i++){
        carac = texto.charCodeAt(i);
        if( (carac > 47 && carac < 58) || (carac > 62 && carac < 127) ){
            //se for numero ou letra normal
            novo += texto.charAt(i);
        }else{
            novo += "&#" + carac + ";";
        }
    }
    return novo;
}


var interval;
var steps = 25;

function GetCurrentYPos(){
    if (document.body && document.body.scrollTop)
      return document.body.scrollTop;
    if (document.documentElement && document.documentElement.scrollTop)
      return document.documentElement.scrollTop;
    if (window.pageYOffset)
      return window.pageYOffset;
    return 0;
}


function ScrollTo(obj){
	obj = document.getElementById(obj);
    // Find the destination's position
    var destx = obj.offsetLeft;
    var desty = obj.offsetTop;
    var thisNode = obj;
    while (thisNode.offsetParent &&
          (thisNode.offsetParent != document.body)) {
      thisNode = thisNode.offsetParent;
      destx += thisNode.offsetLeft;
      desty += thisNode.offsetTop;
    }

    // Stop any current scrolling
    clearInterval(interval);

    cypos = GetCurrentYPos();

    ss_stepsize = parseInt((desty-cypos)/steps);
    interval = setInterval('ScrollWindow('+ss_stepsize+','+desty+')',10);
}

function ScrollWindow(scramount,dest) {
    wascypos = GetCurrentYPos();
    isAbove = (wascypos < dest);
    window.scrollTo(0,wascypos + scramount);
    iscypos = GetCurrentYPos();
    isAboveNow = (iscypos < dest);
    if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
      // if we've just scrolled past the destination, or
      // we haven't moved from the last scroll (i.e., we're at the
      // bottom of the page) then scroll exactly to the link
      window.scrollTo(0,dest);
      // cancel the repeating timer
      clearInterval(interval);
    }
  }



//I hate js
Date.prototype.setIso = function (string) {
	try{
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
	}
	catch(ex){
	}
}

//AJAX STUFF
function AjaxConnection(){
	this.Send = Send;

	function Send(url, parameters, callback){
		var func = window[callback]; //get a function pointer from the string passed to us
		$.post(url, parameters, func)
	}
}


function XmlParser(){
	this.GetXmlDocument = GetXmlDocument;

	function GetXmlDocument(xml){
		var xmlDoc;

		// code for IE
		if (window.ActiveXObject){
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = "false";
			xmlDoc.loadXML(xml);
		}
		// code for Mozilla, Firefox, Opera, etc.
		else{
	  		var parser = new DOMParser();
			xmlDoc = parser.parseFromString(xml,"text/xml");
	  	}

		return xmlDoc;
	}
}


//SEARCH STUFF
var isDirty = false;


function InitializeSearchBox(){
	var get = GetUrlVars();

	if(get["query"] != null){
		ChangeSearchBox();
		var searchString = get["query"];
		searchString = searchString.replace(/\+/g, ' ');
		searchString = searchString.replace(/</g, '&lt;');
		searchString = searchString.replace(/>/g, ' &gt;');
		searchString = searchString.replace(/\'/g, '&#39;');
		searchString = searchString.replace(/"/g, '&quot;');
		document.getElementById("searchbox").value = unescape(searchString);
	}

	$("#searchbox").click(ChangeSearchBox);
	$("#navbar-search").bind("submit", Validate);
}

function ChangeSearchBox(){
	if(isDirty)
		return;

	var sb = document.getElementById("searchbox");
	sb.style.color = "#000000";
	sb.value = "";
	isDirty = true;
}

function Validate(){
	if(!isDirty)
		return false;
}


function GetUrlVars(){
	var vars = [], hash;

	var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

	for(var i = 0; i < hashes.length; i++){
		hash = hashes[i].split('=');
		vars.push(hash[0]);
		vars[hash[0]] = hash[1];
	}

	return vars;
}


//READING LIST STUFF
var _chapterId;

function AddReadingListItemFromToolbar(chapterId){
	AddReadingListItemCall(chapterId, "AddReadingListItemFromToolbarComplete");
}

function AddReadingListItem(chapterId){
	AddReadingListItemCall(chapterId, "AddReadingListItemComplete");
}

function AddReadingListItemCall(chapterId, callback){
	_chapterId = chapterId;

	var params = new Object();
	params["chapterid"] = chapterId;


	var ac = new AjaxConnection();
	ac.Send("/webservices/addreadinglistitem.php", params, callback);
}

function AddReadingListItemFromToolbarComplete(){
	$("#addreadinglistitemtoolbar").slideUp("normal", ShowMarkAsReadFromToolbar);
}

function AddReadingListItemComplete(){
	$("#addtoreadinglist" + _chapterId).fadeOut(fadeOutSpeed, ShowMarkAsRead);
}

function ShowMarkAsRead(){
	$("#markasread" + _chapterId).fadeIn();
}

function ShowMarkAsReadFromToolbar(){
	$("#updatereadinglistitemtoolbar").slideDown();
}

function UpdateReadingListItemFromToolbar(chapterId, isRead){
	UpdateReadingListItemCall(chapterId, isRead, "UpdateReadingListItemFromToolbarComplete");
}

function UpdateReadingListItem(chapterId, isRead){
	UpdateReadingListItemCall(chapterId, isRead, "UpdateReadingListItemComplete");
}

function UpdateReadingListItemCall(chapterId, isRead, callback){
	_chapterId = chapterId;

	var params = new Object();
	params["chapterid"] = chapterId;
	params["isread"] = isRead;

	var ac = new AjaxConnection();
	ac.Send("/webservices/updatereadinglistitem.php", params, callback);

}

function UpdateReadingListItemComplete(){
	$("#markasread" + _chapterId).fadeOut();
}


function UpdateReadingListItemFromToolbarComplete(){
	$("#readinglisttoolbar").slideUp();
}


//CONFIRMATION DIALOG
function RedirectToLogin(info){
	window.location = '';
}

function ShowConfirmationDialog(type, parameter, object){
	var dialog = document.getElementById('confirmationdialog');
	var dialogText = document.getElementById('confirmationdialog-text');
	var dialogButton = document.getElementById('confirmationdialog-button');

	switch(type){
		case 'AddCircleUser':
			dialogText.innerHTML = 'Are you sure you want to join this circle?';
			$("#confirmationdialog-button").click(function (){AddCircleUser(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteCircleUser':
			dialogText.innerHTML = 'Are you sure you want to leave this circle?';
			$("#confirmationdialog-button").click(function (){DeleteCircleUser(parameter); HideConfirmationDialog();});
			break;
		case 'AddReadingListItem':
			dialogText.innerHTML = 'Are you sure you want to add this work to your reading list?';
			$("#confirmationdialog-button").click(function (){AddReadingListItem(parameter); HideConfirmationDialog();});
			break;
		case 'UpdateReadingListItem':
			dialogText.innerHTML = 'Are you sure you want to mark this work as read?';
			$("#confirmationdialog-button").click(function (){UpdateReadingListItem(parameter, 1); HideConfirmationDialog();});
			break;
		case 'UpdateActionVisibility':
			dialogText.innerHTML = 'Are you sure you want to permanently hide this event?';
			$("#confirmationdialog-button").click(function (){UpdateActionVisibility(parameter); HideConfirmationDialog();});
			break;j
		case 'AddSubscriber':
			dialogText.innerHTML = 'Are you sure you want to become a fan of this member?';
			$("#confirmationdialog-button").click(function (){AddSubscriber(parameter); HideConfirmationDialog();});
			break;
		case 'AddCircleUserFromCirclePage':
			dialogText.innerHTML = 'Are you sure you want to join this circle?';
			$("#confirmationdialog-button").click(function (){AddCircleUserFromCirclePage(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteCircleUserFromCirclePage':
			dialogText.innerHTML = 'Are you sure you want to leave this circle?';
			$("#confirmationdialog-button").click(function (){DeleteCircleUserFromCirclePage(parameter); HideConfirmationDialog();});
			break;
		case 'UpdateReadingListItemFromToolbar':
			dialogText.innerHTML = 'Are you sure you want to mark this work as read?';
			$("#confirmationdialog-button").click(function (){UpdateReadingListItemFromToolbar(parameter, 1); HideConfirmationDialog();});
			break;
		case 'AddReadingListItemFromToolbar':
			dialogText.innerHTML = 'Are you sure you want to add this work to your reading list?';
			$("#confirmationdialog-button").click(function (){AddReadingListItemFromToolbar(parameter); HideConfirmationDialog();});
			break;
		case 'AddSubscriberFromToolbar':
			dialogText.innerHTML = 'Are you sure you want to become a fan of this member?';
			$("#confirmationdialog-button").click(function (){AddSubscriberFromToolbar(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteSubscription':
			dialogText.innerHTML = 'Are you sure you want to remove this member from your favorites?';
			$("#confirmationdialog-button").click(function (){DeleteSubscription(parameter); HideConfirmationDialog();});
			break;
		case 'UpdateAdminMessage':
			dialogText.innerHTML = 'Are you sure you want to hide this message?';
			$("#confirmationdialog-button").click(function (){UpdateAdminMessage(parameter); HideConfirmationDialog();});
			break;
		case 'ActivateSms':
			dialogText.innerHTML = 'Are you sure you want to activate this mobile number?  Scribophile will send an activation SMS message to this number if you choose to continue.';
			$("#confirmationdialog-button").click(function (){ActivateSms(); HideConfirmationDialog();});
			break;
		case 'DeactivateSms':
			dialogText.innerHTML = 'Are you sure you want to deactivate this mobile number?  You won\'t receive mobile notifications until you activate again.';
			$("#confirmationdialog-button").click(function (){DeactivateSms(); HideConfirmationDialog();});
			break;
		case 'AddCoinTransfer':
			dialogText.innerHTML = 'Are you sure you want to send coins to this member?';
			$("#confirmationdialog-button").click(function (){AddCoinTransfer(); HideConfirmationDialog();});
			break;
		case 'AddChapterSubscriptionFromToolbar':
			dialogText.innerHTML = 'Are you sure you want to subscribe to this work?  You\'ll receive an email whenever someone adds a comment or critique.';
			$("#confirmationdialog-button").click(function (){AddChapterSubscription(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteChapterSubscriptionFromToolbar':
			dialogText.innerHTML = 'Are you sure you want to unsubscribe to this work?';
			$("#confirmationdialog-button").click(function (){DeleteChapterSubscription(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteBookStatus':
			dialogText.innerHTML = 'Are you sure you want to remove this book from your bookshelf?';
			$("#confirmationdialog-button").click(function (){DeleteBookStatus(parameter); HideConfirmationDialog();});
			break;
		case 'AddCircleSubscription':
			dialogText.innerHTML = 'Are you sure you want to receive email updates for this circle?';
			$("#confirmationdialog-button").click(function (){AddCircleSubscription(parameter); HideConfirmationDialog();});
			break;
		case 'DeleteCircleSubscription':
			dialogText.innerHTML = 'Are you sure you want to stop receiving email updates for this circle?';
			$("#confirmationdialog-button").click(function (){DeleteCircleSubscription(parameter); HideConfirmationDialog();});
			break;
		case 'AddNotACritiqueFlag':
			dialogText.innerHTML = 'Does this critique contain <b>absolutely no constructive criticism</b>, and should it instead be a comment?';
			$("#confirmationdialog-button").click(function (){AddNotACritiqueFlag(parameter); HideConfirmationDialog();});
			break;
		case 'AddQuoteFlag':
			dialogText.innerHTML = 'Does this critique violate the spirit of the quotation rule?';
			$("#confirmationdialog-button").click(function (){AddQuoteFlag(parameter); HideConfirmationDialog();});
			break;
		case 'AddForumsPostFlag':
			dialogText.innerHTML = 'Does this post contain abuse or other inappropriate content?';
			$("#confirmationdialog-button").click(function (){AddForumsPostFlag(parameter); HideConfirmationDialog();});
			break;
		case 'AddForumsPostDisemvowel':
			dialogText.innerHTML = 'Are you sure you want to disemvowel this post?';
			$("#confirmationdialog-button").click(function (){AddForumsPostDisemvowel(parameter); HideConfirmationDialog();});
			break;

	}
	var offsetTop = dialog.offsetHeight;

	var extraOffset = 5;
	if(isIe)
		extraOffset = 6;

	var iconButtonOffsetTop = 0;
	var iconButtonOffsetLeft = 0;
	if(object.className == 'iconbutton'){
		iconButtonOffsetTop = 103;
		iconButtonOffsetLeft = 28;
	}


	//alert(object.offsetLeft);
	//alert(FindPosition(object)[0]);
	var pos = FindPosition(object);
	var left = (pos[0] + iconButtonOffsetLeft - 18);
	dialog.style.left = left + 'px';
	dialog.style.top = (pos[1]  + 17) + 'px';
	dialog.style.display="none";
	dialog.style.visibility = 'visible';

	//if the box is going to show outside of the browser window, move it a little bit

	var windowDimensions =  GetWindowDimensions();

	if(left + 170 > windowDimensions[0]){
		dialog.style.left = (left - 170) + "px";
		document.getElementById("confirmationdialog-arrow").style.marginLeft = "195px";
	}
	else{
		document.getElementById("confirmationdialog-arrow").style.marginLeft = null;
	}

	$(dialog).fadeIn(fadeInSpeed);
}


function HideConfirmationDialog(){
	document.getElementById('confirmationdialog').style.visibility = 'hidden';
}

function FindPosition(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


//returns array, arr[0] = width ,arr[1] = height
function GetWindowDimensions(){
	result = new Array();

	if (self.innerWidth)
	{
		result[0] = self.innerWidth;
		result[1] = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		result[0] = document.documentElement.clientWidth;
		result[1] = document.documentElement.clientHeight;
	}
	else if (document.body)
	{
		result[0] = document.body.clientWidth;
		result[1] = document.body.clientHeight;
	}

	return result;
}
