// jMVC v1.0 (c) Steven Sanderson - http://blog.codeville.net/

var jMVC=function(model,view,domNode,modelPostbackControl,controller){this.model=model;this.parsedView=this.__parseView(view);this.controller=controller;this.domNode=(typeof(domNode)=="string"?document.getElementById(domNode):domNode);if(modelPostbackControl)
this.modelPostbackControl=(typeof(modelPostbackControl)=="string"?document.getElementById(modelPostbackControl):modelPostbackControl);this.RefreshView();}
jMVC.prototype={model:null,parsedView:null,controller:null,domNode:null,modelPostbackControl:null,autoRefreshView:true,RefreshView:function(){this.domNode.innerHTML=this.__applyViewToModel();if(this.modelPostbackControl)
this.modelPostbackControl.value=this.model.toJSONString();},ParseJSONFromControl:function(control){control=(typeof(control)=="string"?document.getElementById(control):control);return eval("("+control.value+")");},LoadStringFromURL:function(url){var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET",url,false);xmlhttp.send(null);return xmlhttp.responseText;},__parseView:function(template){var blockStart=0;var inCode=false;var parts=[];while(blockStart<template.length){var blockEnd;if(inCode)
blockEnd=template.indexOf("%>",blockStart);else
blockEnd=template.indexOf("<%",blockStart);if(blockEnd==-1)
blockEnd=template.length;parts[parts.length]={"code":inCode,"text":template.substring(blockStart,blockEnd)};blockStart=blockEnd+2;inCode=!inCode;}
return parts;},__applyViewToModel:function(){var script="";var lastWasLiteral=false;var __templateFramework=this;var model=this.model;var controller=this.controller;for(var i=0;i<this.parsedView.length;i++){if(!this.parsedView[i].code){script+=(lastWasLiteral?" + ":"__result += ")+"unescape(\""+escape(this.parsedView[i].text)+"\")";lastWasLiteral=true;}
else if(this.parsedView[i].text.charAt(0)=="="){script+=(lastWasLiteral?" + ":"__result += ")+"("+this.parsedView[i].text.substring(1)+")";lastWasLiteral=true;}
else if(this.parsedView[i].text.charAt(0)=="*"){if(lastWasLiteral)
script+=";";var functionTextEscaped=(this.parsedView[i].text.substring(1)).replace(/\"/g,"\\\\\\\"");script+="var closureName = \"closure\" + Math.ceil(Math.random()*10000000);";script+="eval(closureName + \" = eval(jMVC.prototype.__makeClosure(\\\""+functionTextEscaped+"\\\", \\\""+(this.autoRefreshView?"__templateFramework.RefreshView()":"")+"\\\"));\");";script+="__result += closureName + \"();\"";lastWasLiteral=true;}
else{if(lastWasLiteral)
script+="; ";script+=this.parsedView[i].text;lastWasLiteral=false;}}
var __result="";eval(script);return __result;},__makeClosure:function(fnText,appendCode){var parsedText=fnText.match(/^\s*function\s*\(([^\)]*)\)\s*\{(.*)\}\s*$/);if((!parsedText)||(parsedText.length!=3))
alert("Closures should be expressed in the form: \" function ( <params> ) { <code> }\". You supplied: "+fnText);var params=parsedText[1];var code=parsedText[2];return"(function("+params+") { return function() { "+code+";"+appendCode+" };    })("+params+");";}}
