/*

 Daniel15 JavaScript Framework - By Daniel15, 2011
 http://dl.vc/jsframework
 Feel free to use any of this, but please link back to my site (dan.cx)
*/
var Util={emptyFn:function(){},extend:function(a,b){for(var c in b||{})b.hasOwnProperty(c)&&(a[c]=b[c]);return a},buildQueryString:function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c))if(a[c]instanceof Array)for(var d=0,e=a[c].length;d<e;d++)b.push(c+"[]="+encodeURIComponent(a[c][d]));else if("object"==typeof a[c])for(var f in a[c])a.hasOwnProperty(c)&&b.push(c+"["+f+"]="+encodeURIComponent(a[c][f]));else b.push(c+"="+encodeURIComponent(a[c]));return b.join("&")}},Browser={ie:function(){for(var a=
3,b=document.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="<\!--[if gt IE "+ ++a+"]><i></i><![endif]--\>",c[0];);return 4<a?a:void 0}()};Util.extend(Function.prototype,{delay:function(a){return setTimeout(this,a)}});
Function.prototype.bind||(Function.prototype.bind=function(a){var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d?this:a||window,b.concat(Array.prototype.slice.call(arguments)))};d.prototype=this.prototype;e.prototype=new d;return e});String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});Object.create||(Object.create=function(a){function b(){}b.prototype=a;return new b});
var Ajax=function(a,b){this.url=a;this.currentRequest=null;this.options=Util.extend({method:"post",onSuccess:Util.emptyFn,onFailure:Util.emptyFn,onComplete:Util.emptyFn,format:"json",data:null,context:null},b)};Ajax.requestCount=0;Ajax.requests={};
Ajax.prototype={send:function(a){this.currentRequest&&(this.currentRequest.onreadystatechange=Util.emptyFn,this.currentRequest.abort());var b=this.currentRequest=this._getXHR();b.open(this.options.method,this.url,!0);b.setRequestHeader("X-Requested-With","XMLHttpRequest");"post"==this.options.method&&b.setRequestHeader("Content-Type","application/x-www-form-urlencoded");var c=this,d=++Ajax.requestCount;Ajax.requests[d]=b;b.onreadystatechange=function(){4==b.readyState&&c._onComplete(b,d)};b.send(Util.buildQueryString(a||
this.options.data))},_onComplete:function(a,b){var c=200==a.status?this.options.onSuccess:this.options.onFailure;if("json"==this.options.format){try{var d=JSON.parse(a.responseText)}catch(e){this.options.onFailure.call(this.options.context,a.responseText,a,e)}c.call(this.options.context,d,a)}else c.call(this.options.context,a.responseText,a);this.options.onComplete(a);this.currentRequest=null;Ajax.requests[b]=null;delete Ajax.requests[b]},_getXHR:function(){if(window.XMLHttpRequest)return function(){return new XMLHttpRequest};
if(window.ActiveXObject)return function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(b){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(c){}alert("Could not create AJAX requester!")}}()};window.onunload=function(){for(var a in Ajax.requests)Ajax.requests[a].onreadystatechange=Util.emptyFn,Ajax.requests[a].abort()};window.JSON||(window.JSON={});
window.JSON.parse||(window.JSON.parse=function(a){a=a.replace(/[\n\r]/g,"");return eval("("+a+")")});
var DOM={cache:[],JS_ELEMENT_ID:"js-element-id",create:function(a,b,c,d){void 0==c&&(c=!0);a=document.createElement(a);Util.extend(a,b);if(d)for(var e in d)d.hasOwnProperty(e)&&a.setAttribute(e,d[e]);return c?DOM.wrap(a):a},wrap:function(a){if(!a)return null;if(a instanceof ElementWrapper)return a;"string"==typeof a&&(a=document.getElementById(a));var b=a.getAttribute(this.JS_ELEMENT_ID);if(b)return this.cache[b];b=new ElementWrapper(a);a.setAttribute(this.JS_ELEMENT_ID,this.cache.push(b)-1);return b},
wrapAll:function(a){return new ElementWrapperList(a)}};function ElementWrapper(a){this.element=a}
ElementWrapper.prototype={getElementId:function(){return this.element.getAttribute(DOM.JS_ELEMENT_ID)},set:function(a,b){this.element[a]=b;return this},get:function(a){return this.element[a]},insertAfter:function(a){this.element.parentNode.insertBefore(a.element,this.element.nextSibling);return this},append:function(a){var b=document.createElement("div");for(b.innerHTML=a;b.firstChild;)this.element.appendChild(b.firstChild);return this},getPosition:function(){var a=this.element,b=0,c=0;do b+=a.offsetLeft,
c+=a.offsetTop;while(a=a.offsetParent);return{x:b,y:c}},setStyle:function(a,b){this.element.style[a]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},hasClass:function(a){return-1<(" "+(this.element||this).className.toUpperCase()+" ").indexOf(" "+a.toUpperCase()+" ")},addClass:function(a){this.element.className+=" "+a;return this},removeClass:function(a){this.element.className=(" "+this.element.className+" ").replace(" "+a+"","").trim();return this},firstByTag:function(a,
b){void 0==b&&(b=!0);var c=this.getByTag(a,!1);return c&&c[0]&&(b?DOM.wrap(c[0]):c[0])},getByTag:function(a,b){void 0==b&&(b=!0);var c=this.element.getElementsByTagName(a);return b?DOM.wrapAll(c):c},firstByClass:function(a,b){void 0==b&&(b=!0);var c=this.getByClass(a,!1);return c&&c[0]&&(b?DOM.wrap(c[0]):c[0])},getByClass:function(a,b){void 0==b&&(b=!0);var c=this._getByClass(this.element,a);return b?DOM.wrapAll(c):c},_getByClass:function(){var a=document.createElement("div");return"getElementsByClassName"in
a?function(a,c){return a.getElementsByClassName(c)}:"querySelectorAll"in a?function(a,c){return a.querySelectorAll("."+c)}:function(a,c){for(var d=a.all||a.getElementsByTagName("*"),e=[],f=ElementWrapper.prototype.hasClass,g=0,h=d.length;g<h;g++)f.call(d[g],c)&&e.push(d[g]);return e}}(),firstBySelector:function(a,b){void 0==b&&(b=!0);var c=this.element.querySelectorAll(selectors);return c&&(b?DOM.wrap(c):c)},getBySelector:function(a,b){void 0==b&&(b=!0);var c=this.element.querySelectorAll(a);return b?
DOM.wrapAll(c):c},children:function(){return DOM.wrapAll(this.element.children)},parent:function(a){if(!a)return DOM.wrap(this.element.parentNode);for(var a=a.toUpperCase(),b=this.element.parentNode;b&&b.nodeName.toUpperCase()!=a;)b=b.parentNode;return DOM.wrap(b)},previous:function(){return"previousElementSibling"in document.createElement("div")?function(){return DOM.wrap(this.element.previousElementSibling)}:function(){for(var a=this.element;a=a.previousSibling;)if(1===a.nodeType)return DOM.wrap(a);
return null}}(),next:function(){return"nextElementSibling"in document.createElement("div")?function(){return DOM.wrap(this.element.nextElementSibling)}:function(){for(var a=this.element;a=a.nextSibling;)if(1===a.nodeType)return DOM.wrap(a);return null}}(),remove:function(){DOM.cache[this.element.getAttribute(DOM.JS_ELEMENT_ID)]=null;this.element.parentNode.removeChild(this.element);delete this.element},prependChild:function(a){a instanceof ElementWrapper&&(a=a.element);this.element.insertBefore(a,
this.element.firstChild);return this},cloneNode:function(a){return new ElementWrapper(this.element.cloneNode(a))},setAttribute:function(a,b){this.element.setAttribute(a,b);return this},getAttribute:function(a){return this.element.getAttribute(a)},appendChild:function(a){a instanceof ElementWrapper&&(a=a.element);this.element.appendChild(a);return this},removeChild:function(a){a instanceof ElementWrapper&&(a=a.element);this.element.removeChild(a);return this}};DOM.body=DOM.wrap(document.body);
function $(a){return DOM.wrap(a)}function ElementWrapperList(a){for(var b=0,c=a.length;b<c;b++)this[b]=DOM.wrap(a[b]);this.length=a.length}ElementWrapperList.prototype={toArray:function(){return Array.prototype.slice.call(this)}};(function(){for(var a="set,setAttribute,remove,addClass,removeClass,setStyle,setStyles".split(","),b=0,c=a.length;b<c;b++){var d=a[b];ElementWrapperList.prototype[d]=function(a){return function(){for(var b=0;b<this.length;b++)this[b][a].apply(this[b],arguments);return this}}(d)}})();
var Events=function(){return Util.extend(document.addEventListener?{add:function(a,b,c){a.addEventListener(b,c,!1)},stop:function(a){a.preventDefault();a.stopPropagation()}}:{add:function(a,b,c){a["e"+b+c]=c;a[b+c]=function(){var d=window.event;d.target=d.srcElement;d.currentTarget=a;a["e"+b+c](d)};a.attachEvent("on"+b,a[b+c])},stop:function(a){a.returnValue=!1;a.cancelBubble=!0}},{initPage:function(a){if(window.Page){Page.Global&&Page.Global.init();a||(a=document.body.id);var a=a.split("-"),b=a.shift(),
b=b.charAt(0).toUpperCase()+b.slice(1);if(obj=Page[b]){obj.init&&obj.init();for(var b=0,c=a.length;b<c;b++){var d=a[b].charAt(0).toUpperCase()+a[b].slice(1);obj[d]&&obj[d].init&&obj[d].init()}}}}})}(),EventDelegation={delegates:{},add:function(a,b,c,d,e){var f=a.getElementId();this.delegates[f]||(this.delegates[f]={});this.delegates[f][b]||(this.delegates[f][b]=[],a.addEvent(b,this.handle.bind(this)));this.delegates[f][b].push({tagName:c.toUpperCase(),className:d,fn:e})},handle:function(a){var b=
$(a.currentTarget).getElementId(),c=$(a.target);if(this.delegates[b]&&this.delegates[b][a.type])for(var b=this.delegates[b][a.type],d=0,e=b.length;d<e;d++){var f=b[d];c.get("nodeName").toUpperCase()==f.tagName&&(!f.className||c.hasClass(f.className))&&f.fn.call(c,a)}}};Util.extend(ElementWrapper.prototype,{addEvent:function(a,b){Events.add(this.element,a,b);return this},addDelegate:function(a,b,c,d){EventDelegation.add(this,a,b,c,d);return this}});
var Template={cache:{},get:function(a,b){var c=this.cache[a]||this.parse(a,document.getElementById(a).innerHTML);return b?c(b):c},parse:function(a,b){var c=new Function("obj","var p=[];with(obj){p.push('"+b.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return this.cache[a]=c}},AtarCalc={Common:{currentYear:2011,yearsToShow:[2011,
2010,2009,2008],displayErrors:function(a){a&&0<a.length?(this.errors.setStyle("display","block"),this.errorList.set("innerHTML","<li>"+a.join("</li><li>")+"</li>")):this.errors.setStyle("display","none")},displaySubjects:function(a,b){void 0===b&&(b=!0);if(a){for(var c=this.subjectResults.firstByTag("tbody"),d=DOM.create("tbody"),e=0,f=a.length;e<f;e++){var g=a[e],h=document.createElement("tr");h.appendChild(DOM.create("td",{innerHTML:g.name},!1));b&&h.appendChild(DOM.create("td",{innerHTML:g.desc},
!1));h.appendChild(DOM.create("td",{innerHTML:g.score},!1));if(b)for(var i=0,j=this.yearsToShow.length;i<j;i++)h.appendChild(DOM.create("td",{innerHTML:g.scaled[this.yearsToShow[i]]},!1));else h.appendChild(DOM.create("td",{innerHTML:g.scaled[this.currentYear]},!1));d.appendChild(h)}this.subjectResults.setStyle("display",Browser.ie&&7>=Browser.ie?"block":"table").removeChild(c).appendChild(d)}else this.subjectResults.setStyle("display","none")},displayAggregates:function(a){if(a){for(var b=this.atarResults.firstByTag("tbody"),
c=DOM.create("tbody"),d=0,e=this.yearsToShow.length;d<e;d++){var f=this.yearsToShow[d],g=a[f],h=document.createElement("tr");g.ignore||(h.appendChild(DOM.create("td",{innerHTML:f},!1)),h.appendChild(DOM.create("td",{innerHTML:g.aggregate},!1)),h.appendChild(DOM.create("td",{innerHTML:g.enter},!1)),c.appendChild(h))}this.atarResults.setStyle("display",Browser.ie&&7>=Browser.ie?"block":"table").removeChild(b).appendChild(c)}else this.atarResults.setStyle("display","none")}}};
function Autocomplete(a,b,c){this.element=$(a);this.element.set("autocomplete","off");this.items=b;this.options=Util.extend({onSelect:Util.emptyFn,className:"autocomplete",size:7},c);this.build()}
Autocomplete.prototype={build:function(){this.menu=DOM.create("select",{name:"autocomplete",id:"autocomplete",className:this.options.className,size:this.options.size,onclick:this.selectCurrent.bind(this)});this.element.insertAfter(this.menu);this.element.addEvent("keydown",this.keydown.bind(this));this.element.addEvent("keyup",this.populate.bind(this));Events.add(document.body,"click",this.hide.bind(this))},populate:function(){var a=this.menu.get("selectedIndex"),b=this.menu.get("value"),c=this.element.get("value").toLowerCase(),
d=[];this.menu.get("options").length=0;for(var e in this.items)this.items.hasOwnProperty(e)&&this.items[e].toLowerCase().match(c)&&d.push({id:e,name:this.items[e]});c=0;for(e=d.length;c<e;c++){var f=document.createElement("option");f.value=d[c].id;f.innerHTML=d[c].name;this.menu.appendChild(f)}this.menu.set("selectedIndex",a);(this.menu.get("value")!=b||-1==this.menu.get("selectedIndex"))&&this.menu.set("selectedIndex",0)},setPosition:function(){var a=this.element.getPosition();this.menu.setStyles({top:a.y+
this.element.get("offsetHeight")+"px",left:a.x+"px",width:this.element.get("offsetWidth")+"px"})},show:function(){this.populate();this.setPosition();this.menu.setStyle("display","block")},hide:function(){this.menu.setStyle("display","none");this.element.set("value","")},keydown:function(a){this.show();switch(a.keyCode){case 38:this.previous();Events.stop(a);break;case 40:this.next();Events.stop(a);break;case 13:this.selectCurrent();Events.stop(a);break;case 27:this.hide()}},previous:function(){0==
this.menu.get("selectedIndex")?this.menu.set("selectedIndex",this.menu.get("options").length-1):this.menu.element.selectedIndex--},next:function(){this.menu.get("selectedIndex")==this.menu.get("options").length-1?this.menu.set("selectedIndex","0"):this.menu.element.selectedIndex++},selectCurrent:function(){this.element.set("value","");this.hide();this.options.onSelect(this.menu.get("value"),this.menu.get("options")[this.menu.get("selectedIndex")].text)}};AtarCalc.Site=Object.create(AtarCalc.Common);
Util.extend(AtarCalc.Site,{latestData:null,init:function(a){this.subjects=a;this.subjectsEl=$("subjects");this.loading=$("loading");this.errors=$("errors");this.errorList=this.errors.firstByTag("ul");this.subjectResults=$("subject_results");this.atarResults=$("atar_results");this.outputPlaceholder=$("output_placeholder");$("hide_main").addEvent("click",function(a){document.getElementById("info").style.display="none";document.getElementById("show_main").style.display="inline";Events.stop(a)});$("show_main").addEvent("click",
function(a){document.getElementById("info").style.display="block";document.getElementById("show_main").style.display="none";Events.stop(a)});this.subjectsEl.addDelegate("keyup","input","score",this.update.bind(this));this.subjectTemplate=Template.get("subject_tmpl");new Autocomplete("subject",a,{onSelect:this.addSubject.bind(this)});this.request=new Ajax("calc.php",{context:this,onSuccess:this.displayUpdate});this.Social.init()},addSubject:function(a,b){this.subjectsEl.append(this.subjectTemplate({id:a,
name:b}));_gaq.push(["_trackEvent","Subject",b])},deleteSubject:function(a){$("subject_"+a).remove();AtarCalc.Site.update()},update:function(){this.analyticsTimeout&&(clearTimeout(this.analyticsTimeout),this.analyticsTimeout=null);for(var a={increment:document.getElementById("increment").value},b=this.subjectsEl.getByTag("input"),c=0,d=b.length;c<d;c++)a[b[c].get("name")]=b[c].get("value");this.loading.setStyle("visibility","visible");this.request.send(a);this.analyticsTimeout=setTimeout(function(){_gaq.push(["_trackEvent",
"Calculation","Update"]);AtarCalc.Site.analyticsTimeout=null},1500)},displayUpdate:function(a){this.outputPlaceholder.setStyle("display","none");this.latestData=a;this.displayErrors(a.errors);this.displaySubjects(a.subjects);this.displayAggregates(a.years);a&&a.years&&this.shareResults.setStyle("display","block");this.loading.setStyle("visibility","hidden")}});
AtarCalc.Site.Social={init:function(){AtarCalc.Site.shareResults=$("share_results");this.twitterButton=$("share_twitter");this.twitterButton.addEvent("click",this.twitter);this.facebookButton=$("share_facebook");this.facebookButton.addEvent("click",this.facebook)},twitter:function(a){var b=AtarCalc.Site.latestData.years[AtarCalc.Common.currentYear].enter,c=Math.round(screen.width/2-275),d=Math.round(screen.height/2-210),b="https://twitter.com/intent/tweet?"+Util.buildQueryString({text:"I estimated my ATAR to be "+
b+" at",url:"http://atarcalc.com/",related:"Daniel15:Creator of the ATAR Calculator"});window.open(b,"intent","width=550,height=420,left="+c+",top="+d+",scrollbars=yes,resizable=yes,toolbar=no,location=yes");Events.stop(a);_gaq.push(["_trackSocial","twitter","Share Calculation"])},facebook:function(a){FB.ui({method:"feed",description:"I estimated my ATAR to be "+AtarCalc.Site.latestData.years[AtarCalc.Common.currentYear].enter,link:"http://atarcalc.com/",actions:[{name:"Estimate yours",link:"http://atarcalc.com"}]});
Events.stop(a);_gaq.push(["_trackSocial","facebook","Share Calculation"])}};

