/**
*
* @author Bernardo Rufino
* @license Creative Commons Developing Nations: http://creativecommons.org/licenses/devnations/2.0/
* @version 0.8
* @description Script to add dynamic navigating functionality, it’s framework independent
*
* !Não retire essas informações!
* !Do not drop this information!
*/

//Just like the prototype, it returns a function wrapped in a context

//CÓDIGO comentado, PARA SER USADO JUNTO COM O PROTOTYPE

/*Function.prototype.bind = function(context){
var closure = this;
var tmp_fnc = function(){
return closure.apply(context, arguments);
}
return tmp_fnc;
}

Object.prototype.merge = function(object){
for(attr in object){
this[attr] = object[attr];
}
}*/

document.navigators = {
settings: {
interval: 100, //The interval which the verification for new data will be done (in miliseconds)
helper: true, //Specify if the onnavigate function will return the helper, do not change!
iframe_src: "control.htm" //The location of the file control.htm, absolute path please
},
initialize: function(){
this.is_ie = (navigator.userAgent.toLowerCase().indexOf("msie") > -1) ? true : false;
if(this.is_ie){
this.settings.iframe_src = this.settings.iframe_src.replace(/(\?|#).*$/, "");
window.attachEvent("onload", (function(){
//this.running = true; The iFrame that needs to make it running
this.iframe = document.createElement("iframe");
this.iframe.setAttribute("src", this.settings.iframe_src);
this.iframe.style.display = "none";
document.getElementsByTagName("body")[0].appendChild(this.iframe);
}).bind(this));
} else {this.running = true;}
},
//The function that is called by the user and puts new data in the hash to be called
helper: function(data, force){
var navs = document.navigators; var data = "[" + this.id + "]" + data;
if(force){navs.data_buffer = "";} //If force is true then calling sequentially the same helper works
//if(navs.is_ie){navs.iframe.src = navs.settings.iframe_src + "?id=" + data;}
window.location.hash = "#!" + data;
},
called: false,
history: [],
data_buffer: ""
};

function onnavigate(id, callback){
var navs = document.navigators; navs[id] = {};
if(!navs.running){navs.initialize();}
setInterval(function(){if(navs.running){
var url = window.location.href;
var hash = window.location.hash.replace(/#!/, "");
var theid = "#![" + id + "]";
if(url.indexOf(theid) > -1){ //If the call is with us!
var data = url.split(theid)[1] || "";
var new_data = theid + data;
if(navs.data_buffer != new_data){ //If the old content is diferent
callback(data); //Calling the callback function!
navs.called = true; //To make sure was already called to fix the index state
navs.history.push(new_data);
navs.data_buffer = new_data;
}
} else if (!hash && navs.called){ //If the navigators was called and the page is in index state (no hashes), it means reload!
navs.running = false; //To stop the others Intervals to dont make it the same way and broke something
window.location = ((url.indexOf("#!") > -1) ? url.split("#!")[0] : url) + "#!";
window.location.reload();
}
}}, navs.settings.interval);

//CÓDIGO ALTERADO, PARA SER USADO JUNTO COM O PROTOTYPE começa aqui
navs[id].merge = function(object){
for(attr in object){
this[attr] = object[attr];
}
}
//CÓDIGO ALTERADO , PARA SER USADO JUNTO COM O PROTOTYPE termina aqui

navs[id].merge({callback: callback});
if(navs.settings.helper){
navs[id].helper = navs.helper.bind({id: id}); return navs[id].helper;
}
}

