// fieldname, warningname, remainingname, maxchars
function CheckFieldLength(fn,wn,rn,mc) {
  var len = fn.value.length;
  if (len > mc) {
    fn.value = fn.value.substring(0,mc);
    len = mc;
  }
  document.getElementById(wn).innerHTML = len;
  document.getElementById(rn).innerHTML = mc - len;
}

//Generic functions first!
function isEmpty(s){
	return ((s == null) || (s.length == 0))}

function checkFileExtension(input, element)
{
	message = document.getElementById(element);
	val = document.getElementById(input).value;
	if(val.length == 0){
		return true;
		}
	fileregexp = new RegExp("^.+(.jpg|.pdf|.gif|.txt|.zip|.png|.doc|.xls|.ps|.tex|.c|.cpp|.java|.ppt|.docx|.pptx|.xlsx)$", "i");
	var matches = fileregexp.exec(val);
	if(matches){
		//message.className = 'hidden';
		return true;
	}
	else{
		message.className = 'error';
		message.value = 'Invalid file type. Accepted file types are: .jpg, .pdf, .gif, .txt, .zip, .png, .doc, .xls, .ps, .tex, .c, .cpp, .java, .docx, .xlsx, .pptx';
		return false;
	}
}	
	
function checkText(n){
	if(isEmpty(n)){ return false;}
	if(!checkLengthMin(n, 3)){ return false;}
	return true;
}
function checkLengthMin(obj, len){
	if(obj.length < len){ return false;}
	return true;
}

function isNotInt(n){
	var digits = "1234567890"
	var i
	for(i = 0; i < n.length; i++){
		if(digits.indexOf(n.charAt(i)) < 0){
			return false;}
	}
	return true; }
function isNotFloat(n){
	var digits = ".1234567890"
	var i
	for(i = 0; i < n.length; i++){
		if(digits.indexOf(n.charAt(i))<0){
			return false;}
	}
	return true;}

function checkLengthMax(obj, len){
	if(obj.length > len){ return false;}
	return true;}


function checkGenericText(input, element){

	message = document.getElementById(element);
	
	if(!checkText(input)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkGenericTextMaxLen(input, element, length){

	message = document.getElementById(element);
	
	if(!checkText(input) || !checkLengthMax(input, length)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkGenericTextMaxLenNotZeroCheck(input, element, length){

	message = document.getElementById(element);
	
	if(!checkLengthMax(input, length)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkGenericTextMinLen(input, element, length){

	message = document.getElementById(element);
	
	if(!checkText(input) || !checkLengthMin(input, length)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkNumNotZero(input, element){

	message = document.getElementById(element);
	
	if(input == 0){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function compareStrings(input1, input2, element){

	message = document.getElementById(element);
	
	if(input1 != input2){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
	}
}	
function checkRadioChecked(input, element){
	message = document.getElementById(element);
	
	for(i=0; i<input.length; i++){
		if(input[i].checked){
			message.className = 'hidden';
			return true;
			}
		}
	message.className = 'error';
	return false;
}
function checkNumCheckedMin(input, element, minnum){

	message = document.getElementById(element);
	var j=0;
	
	for(i=0; i<input.length; i++){
		if(input[i].checked == true){
			j++;
			}
		}
	if(j < minnum){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}

//End of generic functions

function checkBounty(input, element){

	message = document.getElementById(element);
	
	if(!isNotFloat(input) || input < 0.25 || isEmpty(input)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkBountyFirm(input, firm, element){

	message = document.getElementById(element);
	
	if(input > firm || isEmpty(input)){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
		}
}
function checkBountyNotLoggedIn(input, element){

	message = message = document.getElementById(element);
	if(input > 150){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
	}
}
function checkBountyAgainstMax(balance, curCutOff, bounty, element){

	message = message = document.getElementById(element);
	if((balance < bounty) && bounty > curCutOff){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
	}
}
function checkValidCat(input, index, element){

	message = document.getElementById(element);
	
	if(index < 0){
		message.className = 'error';
		return false;
		}
	
	if(input.options[index].value == "-- Sub-Category --" || input.options[index].value == "-- Subject 1 --"){
		message.className = 'error';
		return false;
		}
	else{
		message.className = 'hidden';
		return true;
	}
}



function checkISBN(input,response) {
  message = document.getElementById('invalidisbn');
  if (input !='')
   { 
   	 urlstring="/cgi/ajax_checkisbn?isbn="+input;
     loadXMLDoc(urlstring);
   }
  if (response == '' && input=='') { message.className='hidden'; }
   
}
//ajax stuff for ISBN only

function ISBNprocessReqChange() 
{
    // only if req shows "complete"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            // ...processing statements go here...
      response  = req.responseXML.documentElement;

      method    = response.getElementsByTagName('method')[0].firstChild.data;

      result    =  response.getElementsByTagName('result')[0].firstChild.data;
      message = document.getElementById('invalidisbn');
      if (result == '1') { message.className='error'; }
	  else { 
		message.className = 'hidden';
		if (response.getElementsByTagName('pricat')[0].firstChild.data > 0) {
			var pricatsel = document.getElementById('subject1');
			for (i=0;i<pricatsel.length;i++)
			{
				if (response.getElementsByTagName('pricat')[0].firstChild.data == pricatsel.options[i].value)
				{
					pricatsel.selectedIndex=i;
					populate();
				
				}
			}
		}
		if (response.getElementsByTagName('subcat')[0].firstChild.data>0) {
			var subcatsel = document.getElementById('subcat1');
			for (i=0;i<subcatsel.length;i++)
			{
				if(response.getElementsByTagName('subcat')[0].firstChild.data == subcatsel.options[i].value)
				{
					subcatsel.selectedIndex=i;
				}
			}
		}	
	  }
	
        } else {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}

function loadXMLDoc(url) 
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = ISBNprocessReqChange;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = ISBNprocessReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}


var file=true,title=false,solution=false,price=false,savefag=false;
function loadAskValidators() {
	FormValidator.add('vfile', {
		errorMsg: 'Invalid file type. Accepted file types are: .jpg, .pdf, .gif, .txt, .zip, .png, .doc, .xls, .ps, .tex, .c, .cpp, .java, .ppt, .docx, .pptx, .xlsx',
		test: function(element){
		if (element.value.length > 0) {
		 res=element.value.test("^.+(.jpg|.pdf|.gif|.txt|.zip|.png|.doc|.xls|.ps|.tex|.c|.cpp|.java|.ppt|.docx|.pptx|.xlsx)$", "i");
		 return  file=res;
		} else {  return true; }
		}});
	FormValidator.add('vtitle',{errorMsg: 'Please enter a title for your question, up to 120 characters.',
		test:function(e){ e.value=trim(e.value); if (e.value.length >=5 && e.value.length<=120) { title=true; return true;} else { title=false;	return false; }}});
	FormValidator.add('vbountynotlogged', {
		errorMsg: 'You need a Student of Fortunce account to set a price higher then $150. Click <a href="/cgi/registration">here</a> to register.',
		test: function(e){if (e.value > 150 || e.value < .25) { return  false;} else { return true;}	}});
	FormValidator.add('vbountylogged', {
		errorMsg: 'You must deposit more money in your Student of Fortune account to ask a question with a price over $150. Click <a href="/cgi/myaccount_addfunds">here</a> to deposit.',
		test: function(e){if(((e.value < $('userbal').value) && e.value > 150) || e.value < .25) {return  false;	} else { return true;}
		}});
	FormValidator.add('vquestion', {
		errorMsg: 'Please enter your question. It cannot be longer than 20,000 characters.',
		test: function(e){ e.value=tinyMCE.get('question_txt').getContent(); if (e.value.length > 20000 || e.value.length < 5) { return  false; } else {return true;}}});
	FormValidator.add('vsubject', {
		errorMsg: 'Please select a category for this question to be filed under.',
		test: function(e){if (e.value < 1) {return  false; } else {return true; }}});
	FormValidator.add('vsubcat', {
		errorMsg: 'Please select a sub-category for this question to be filed under.',
		test: function(e){	if (e.value < 1) {	return  false; } else {return true; }}});
	FormValidator.add('vduedate', {
		errorMsg: 'Please enter a due date in the future.',
		test: function(e){if (Date.parse(e.value).diff(new Date,'day') > 0)  { return  false; } else {return true; }}});
	FormValidator.add('vsubmit', {
		errorMsg: '',
		test: function(e){return true;}});
    FormValidator.add('vtutsubmit', {
		errorMsg: '',
		test: function(e){
		if(file==true && title==true && solution==true && price==true){  	showWaiter('Processing','Please wait while your tutorials is uploading');if(savefag==true){	window.setTimeout( function(){ document.forms['mainform'].submit();	},1000);  return  false;}else{ return true;}   }else{ return false;}   }});
	FormValidator.add('vsolution', {
		errorMsg: 'Please enter the text of your tutorial, max 20,000 characters and min 25 characters.',
		test: function(e){	e.value=tinyMCE.get('solution').getContent();if (e.value.length > 20000 || e.value.length < 25) { solution=false; return  false; } else { solution=true; return true;}
		}});
	FormValidator.add('vprice', {
		errorMsg: 'Please select a price you wish to be paid for this tutorial. It must be atleast $0.25.',
		test: function(e){if (!($('negotiable').value)&&(parseFloat(e.value) > parseFloat($('bounty').value) || isEmpty(e.value)) || parseFloat(e.value) < 0.25 ) {	price=false; return  false;} else { price=true; return true;	}
		}});	
		
}

function loadRegValidators() {
	
	FormValidator.addAllThese([['vusername',{ errorMsg:'some error',
	test: function(e) { 
		if (e.value.length < 3) { this.errorMsg='Your username must be at least three characters long.';  return false; }
		else if (e.value.match(/\s/)) { this.errorMsg='Your username cannot have any spaces.'; return false; }
		else if (e.value.match(/\W/)) { this.errorMsg='You username can have only have letters and numbers (no symbols, dots or underscores).'; return false; }
		 return true; }
	}],
	['vemail',{ errorMsg:"Please enter a valid email address.", 
			test: function(e) {if(!(/^[^@]+@([a-zA-Z\-]+\.)+[a-zA-Z]{2,}$/.test(e.value)) || e.value.length < 3){ $('dupemail').value=1; return false; } return true; } }],
	['vdupemail',{errorMsg:'Email already in use or invalid. You are only allowed to have one Student of Fortune account per person.',
		test: function(e) { if(e.value==1) { if ($('advice-email-taken')) {  $('advice-email-taken').destroy(); } return false; } return true; }}],		 
	['vpassword',{errorMsg:'Your password must be at least 6 characters long.',
		test: function(e) { if(e.value.length < 6) { return false; } return true; }}],
	['vpassword2',{errorMsg:"Your passwords don't match.", 
		test: function(e) { if (e.value != $('password1').value) { return false;} return true; }}],
	['vzip',{errorMsg:"Please enter your ZIP/Postal code.",
		test: function(e) { if (e.value.length < 2) { return false; } return true; }}],
	['user-exists',{errorMsg:"This user name is already in use please choose another one.",
		test: function(e) { return false; }}],
	['vage',{errorMsg:'You must be at least 18 years old to use Student of Fortune.',
		test:function(e) {
	    var theirDate = new Date((parseInt($('dobYear').value) + 18), parseInt($('dobMonth').value)-1, parseInt($('dobDay').value));
	    var today = new Date;
	    if ( (today.getTime() - theirDate.getTime()) < 0) { return false; }
	    return true; }}],
    ['validate-required-check', {
            errorMsg: function(element, props) {
              return props.useTitle ? element.get('title') : 'Please agree to the terms of service';
            },
            test: function(element, props) {
              return !!element.checked;
            }}]
	]);

}

function check_question_text(text) {
        if (text.search(/ essay /i)>0 || text.search(/ paper /i)>0 || text.search(/ mla format /i)>0 || text.search(/ apa format /i)>0) {
                return 1;
        } else if (text.search(/ login /i)>0 || text.search(/ log in /i)>0|| text.search(/quiz/i)>0|| text.search(/ exam /i)>0|| text.search(/checkpoint/i)>0|| text.search(/discussion question/i)>0) {
                return 2;
        }
        return false;
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function showWaiter(heading,message){
new StickyWinModal({content:StickyWin.ui(heading,"<div><img src=\"/images/ajax-loader.gif\"><br /><b>"+message+"<b></div>",{width:'300px','z-Index':-1}),
			position:'center',closeClassName :false});
var mod=new Modalizer();
mod.setModalOptions({hideOnClick :false,modalStyle:{
	'background-color':'#000000',
    'z-Index':1,
    'opacity':0.5
  }});
mod.modalShow();
return true;
}