/////////////////////////////////
// 3RD PARTY SUPPORT FUNCTIONS //
/////////////////////////////////

//DomReady http://code.google.com/p/domready
(function(){var DomReady=window.DomReady={};var userAgent=navigator.userAgent.toLowerCase();var browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:(/msie/.test(userAgent))&&(!/opera/.test(userAgent)),mozilla:(/mozilla/.test(userAgent))&&(!/(compatible|webkit)/.test(userAgent))};var readyBound=false;var isReady=false;var readyList=[];function domReady(){if(!isReady){isReady=true;if(readyList){for(var fn=0;fn<readyList.length;fn++){readyList[fn].call(window,[])}readyList=[]}}};function addLoadEvent(func){var oldonload=window.onload;if(typeof window.onload!='function'){window.onload=func}else{window.onload=function(){if(oldonload){oldonload()}func()}}};function bindReady(){if(readyBound){return}readyBound=true;if(document.addEventListener&&!browser.opera){document.addEventListener("DOMContentLoaded",domReady,false)}if(browser.msie&&window==top)(function(){if(isReady)return;try{document.documentElement.doScroll("left")}catch(error){setTimeout(arguments.callee,0);return}domReady()})();if(browser.opera){document.addEventListener("DOMContentLoaded",function(){if(isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return}domReady()},false)}if(browser.safari){var numStyles;(function(){if(isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return}if(numStyles===undefined){var links=document.getElementsByTagName("link");for(var i=0;i<links.length;i++){if(links[i].getAttribute('rel')=='stylesheet'){numStyles++}}var styles=document.getElementsByTagName("style");numStyles+=styles.length}if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return}domReady()})()}addLoadEvent(domReady)};DomReady.ready=function(fn,args){bindReady();if(isReady){fn.call(window,[])}else{readyList.push(function(){return fn.call(window,[])})}};bindReady()})();

//BetterInnerHTML v1.2, (C) OptimalWorks.net
function BetterInnerHTML(o,p,q){function r(a){var b;if(typeof DOMParser!="undefined")b=(new DOMParser()).parseFromString(a,"application/xml");else{var c=["MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"];for(var i=0;i<c.length&&!b;i++){try{b=new ActiveXObject(c[i]);b.loadXML(a)}catch(e){}}}return b}function s(a,b,c){a[b]=function(){return eval(c)}}function t(b,c,d){if(typeof d=="undefined")d=1;if(d>1){if(c.nodeType==1){var e=document.createElement(c.nodeName);var f={};for(var a=0,g=c.attributes.length;a<g;a++){var h=c.attributes[a].name,k=c.attributes[a].value,l=(h.substr(0,2)=="on");if(l)f[h]=k;else{switch(h){case"class":e.className=k;break;case"for":e.htmlFor=k;break;default:e.setAttribute(h,k)}}}b=b.appendChild(e);for(l in f)s(b,l,f[l])}else if(c.nodeType==3){var m=(c.nodeValue?c.nodeValue:"");var n=m.replace(/^\s*|\s*$/g,"");if(n.length<7||(n.indexOf("<!--")!=0&&n.indexOf("-->")!=(n.length-3)))b.appendChild(document.createTextNode(m))}}for(var i=0,j=c.childNodes.length;i<j;i++)t(b,c.childNodes[i],d+1)}p="<root>"+p+"</root>";var u=r(p);if(o&&u){if(q!=false)while(o.lastChild)o.removeChild(o.lastChild);t(o,u.documentElement)}}

//Get element by class by Robert Nyman, http://www.robertnyman.com
var getElementsByClassName=function(className,tag,elm){if(document.getElementsByClassName){getElementsByClassName=function(className,tag,elm){elm=elm||document;var elements=elm.getElementsByClassName(className),nodeName=(tag)?new RegExp("\\b"+tag+"\\b","i"):null,returnElements=[],current;for(var i=0,il=elements.length;i<il;i+=1){current=elements[i];if(!nodeName||nodeName.test(current.nodeName)){returnElements.push(current);}}
return returnElements;};}
else if(document.evaluate){getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck="",xhtmlNamespace="http://www.w3.org/1999/xhtml",namespaceResolver=(document.documentElement.namespaceURI===xhtmlNamespace)?xhtmlNamespace:null,returnElements=[],elements,node;for(var j=0,jl=classes.length;j<jl;j+=1){classesToCheck+="[contains(concat(' ', @class, ' '), ' "+classes[j]+" ')]";}
try{elements=document.evaluate(".//"+tag+classesToCheck,elm,namespaceResolver,0,null);}
catch(e){elements=document.evaluate(".//"+tag+classesToCheck,elm,null,0,null);}
while((node=elements.iterateNext())){returnElements.push(node);}
return returnElements;};}
else{getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck=[],elements=(tag==="*"&&elm.all)?elm.all:elm.getElementsByTagName(tag),current,returnElements=[],match;for(var k=0,kl=classes.length;k<kl;k+=1){classesToCheck.push(new RegExp("(^|\\s)"+classes[k]+"(\\s|$)"));}
for(var l=0,ll=elements.length;l<ll;l+=1){current=elements[l];match=false;for(var m=0,ml=classesToCheck.length;m<ml;m+=1){match=classesToCheck[m].test(current.className);if(!match){break;}}
if(match){returnElements.push(current);}}
return returnElements;};}
return getElementsByClassName(className,tag,elm);};var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}

//Get elements by tag names from quirksmode.org/dom/getElementsByTagNames.html
function getElementsByTagNames(list,obj){if(!obj)var obj=document;var tagNames=list.split(',');var resultArray=new Array();for(var i=0;i<tagNames.length;i++){var tags=obj.getElementsByTagName(tagNames[i]);for(var j=0;j<tags.length;j++){resultArray.push(tags[j]);}}
var testNode=resultArray[0];if(!testNode)return[];if(testNode.sourceIndex){resultArray.sort(function(a,b){return a.sourceIndex-b.sourceIndex;});}
else if(testNode.compareDocumentPosition){resultArray.sort(function(a,b){return 3-(a.compareDocumentPosition(b)&6);});}
return resultArray;}
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}

//Get variables from URL
function getUrlVars(theURL) {
var vars = [], hash;
var hashes = theURL.slice(theURL.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;
}

///////////////////////////////////////
// WEBSITE LOAD AND RELOAD FUNCTIONS //
///////////////////////////////////////

//Functions to perform on page load
function page_init() {

// Tabs
function quickTabs(tabbed) {
var elements = tabbed.getElementsByTagName('li');
var selected = elements;
for (var i = 0; i < elements.length; i++) {
elements[i].onclick = function () {
for (var x = 0; x < selected.length; x++) {
selected[x].className = selected[x].className.replace('selected', '');
}
this.className += ' selected';
}
}
}
var tabs = getElementsByClassName('tabs', 'div');
for (var t = 0; t < tabs.length; t++) {
quickTabs(tabs[t]);
}

}

// Functions that can be recalled after changes to DOM
function page_reload() {

//Open links with 'external' class in new window
var links = getElementsByClassName('external', 'a');
for (var i = 0; i < links.length; i++) links[i].target = '_blank';

//Provide confirmation pop ups for links with 'check' class.
var checks = getElementsByClassName('check', 'a');
for (var i = 0; i < checks.length; i++) {
checks[i].onclick = function () {
var check = confirm('Are you sure?');
if (check) window.location = this.href;
else return false;
}
}

//Hide error notices on click
var errors = getElementsByClassName('error', 'p');
for (var i = 0; i < errors.length; i++) {
errors[i].onclick = function () {
this.style.display = 'none';
}
}

//Hide and show fields that toggle
var toggles = getElementsByClassName('toggle-field', 'div');
for (var i = 0; i < toggles.length; i++) toggles[i].className += ' toggle-hidden';

}

//Toggle visibility
function toggle(target) {
var ele = document.getElementById(target);
if (ele.className.indexOf('toggle-hidden') > 0) ele.className = ele.className.replace(' toggle-hidden', '');
else ele.className += ' toggle-hidden';
return false;
}

// Remaining
function remaining(field, theLength) {
if (theLength == undefined) theLength = 400;
if (field.value.length >= theLength) field.value = field.value.substring(0, theLength);
document.getElementById('remaining').innerHTML = theLength - field.value.length + '/' + theLength + ' Characters remaining. ';
}


/////////////////////
// FORM VALIDATION //
/////////////////////

//Get elements inside form
function form_validate(ele) {
var elements = getElementsByTagNames('input,select,textarea', ele);
for (var i = 0; i < elements.length; i++) if (elements[i].type != 'file') elements[i].onchange = function () {
validate_this(this);
};
ele.onsubmit = function () {
var valid = true;
for (var i = 0; i < elements.length; i++) {
var result = validate_this(elements[i]);
if (valid == true) valid = result;
}
if (valid == true) document.getElementById('ajax-load').style.display = 'inline';
return valid;
}
}

//Validation
function validate_this(ele) {

var type = ele.name;
var element = document.getElementById(ele.id);

var valid = true;

if (type == 'email') {

if (document.getElementById('o_email') == undefined) {
if (element.value == '') {
create_error('Please enter your email address.', element);
valid = false;
}
}
if (element.value != '' && /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i.test(element.value) == false) {
create_error('Please enter a valid email address.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'password') {
if (element.value == '' || element.value.length < 4) {
create_error('Please enter a password of at least 4 characters.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'password_new') {
if (element.value != '' && element.value.length < 4) {
create_error('Please enter a password of at least 4 characters.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'password_repeat' && document.getElementById('password_new')) {
if (document.getElementById('password_new').value.length > 0) {
if (element.value == '' || element.value.length < 4) {
create_error('Please confirm your password.', element);
valid = false;
}
else if (document.getElementById('password_new').value != element.value) {
create_error('The password you entered does not match.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'username' || type == 'rpx_username') {
if (element.value == '' || element.value.length < 4) {
create_error('Please enter an alias to display.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'terms' || type == 'rpx_terms') {
if (element.checked == false) {
create_error('You must agree to the terms of service.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'type') {
var isChecked = false;
var radios = getElementsByTagNames('input', element.parentNode.parentNode);
for (var r = 0; r < radios.length; r++) {
if (isChecked == false) isChecked = radios[r].checked;
else isChecked = true;
}
if (isChecked == false) {
create_error('You must select a feedback type.', element.parentNode);
valid = false;
}
else {
create_error('', element.parentNode);
valid = true;
}
}

if (type == 'title') {
if (element.value == '' || element.value.length < 4) {
create_error('Please enter a question.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'category') {
if (element.options[element.selectedIndex].value == '') {
create_error('Please select a category.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

if (type == 'detail') {
if (element.value == '' || element.value.length < 10) {
create_error('Please enter a few more details about your question.', element);
valid = false;
}
else {
create_error('', element);
valid = true;
}
}

return valid;
}

//Error messages
create_error = function (message, ele) {
var contain = ele.parentNode;
var span = getElementsByClassName('form-error', 'span', contain)[0];
if (span != undefined) {
if (message == '') {
contain.removeChild(span);
ele.className = ele.className.replace(' error', '');
}
else span.innerHTML = message;
}
else if (message != '') {
ele.className += ' error';
var newError = '<span class="clear form-error">' + message + '</span>';
BetterInnerHTML(contain, newError, false);
}
}


///////////////////////
// XML HTTP REQUESTS //
///////////////////////

//Setup request format
function ajaxSetup() {
var request;
try {
request = new XMLHttpRequest();
}
catch (e) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
return false;
}
}
}
return request;
}

//Ajax Request function (GET or POST, target ID, headers)
function ajaxRequest(type, target, headers, post) {

var target = document.getElementById(target);
var loading = document.getElementById('ajax-load');

if (type == 'POST') {
aRequest.open('POST', '?ajax=1&' + headers, true);
aRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
else {
var post = null;
aRequest.open('GET', '?ajax=1&' + headers, true);
}

loading.style.display = 'inline';

ajaxLoad = function () {
loading.style.display = 'none';
BetterInnerHTML(target, aRequest.responseText, true);
}

aRequest.onreadystatechange = function () {
if (aRequest.readyState == 4 || aRequest.readyState == 'complete') {
setTimeout('ajaxLoad()', 600);
page_reload();
}
}
aRequest.send(post);
}


////////////
// Onload //
////////////
DomReady.ready(function () {
Cufon('h1');
page_init();
page_reload();
});
var aRequest = ajaxSetup();
